/*******************************************************************************
 * Copyright 2019-2020 Intel Corporation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *******************************************************************************/

#include <internal/common/ifma_math.h>

#ifdef __GNUC__
#define ASM(a) __asm__(a);
#else
#define ASM(a)
#endif

void AMS5x52x40_diagonal_mb8(int64u *out_mb, const int64u *inpA_mb,
                             const int64u *inpM_mb, const int64u *k0_mb) {
  __ALIGN64 U64 res[80];
  __ALIGN64 U64 u[40];
  U64 k;//, carry;
  U64 *a = (U64 *)inpA_mb;
  U64 *m = (U64 *)inpM_mb;
  U64 *r = (U64 *)out_mb;
  int iter;
  const int iters = 5;

  k = loadu64((U64 *)k0_mb);
  for (iter = 0; iter < iters; ++iter) {
    int i;
    for (i = 0; i < 80; ++i)
      res[i] = get_zero64();

    // Calculate full square
    res[1] = fma52lo(res[1], a[0], a[1]);     // Sum(1)
    res[2] = fma52hi(res[2], a[0], a[1]);     // Sum(1)
    res[2] = fma52lo(res[2], a[0], a[2]);     // Sum(2)
    res[3] = fma52hi(res[3], a[0], a[2]);     // Sum(2)
    res[3] = fma52lo(res[3], a[1], a[2]);     // Sum(3)
    res[4] = fma52hi(res[4], a[1], a[2]);     // Sum(3)
    res[3] = fma52lo(res[3], a[0], a[3]);     // Sum(3)
    res[4] = fma52hi(res[4], a[0], a[3]);     // Sum(3)
    res[4] = fma52lo(res[4], a[1], a[3]);     // Sum(4)
    res[5] = fma52hi(res[5], a[1], a[3]);     // Sum(4)
    res[5] = fma52lo(res[5], a[2], a[3]);     // Sum(5)
    res[6] = fma52hi(res[6], a[2], a[3]);     // Sum(5)
    res[4] = fma52lo(res[4], a[0], a[4]);     // Sum(4)
    res[5] = fma52hi(res[5], a[0], a[4]);     // Sum(4)
    res[5] = fma52lo(res[5], a[1], a[4]);     // Sum(5)
    res[6] = fma52hi(res[6], a[1], a[4]);     // Sum(5)
    res[6] = fma52lo(res[6], a[2], a[4]);     // Sum(6)
    res[7] = fma52hi(res[7], a[2], a[4]);     // Sum(6)
    res[7] = fma52lo(res[7], a[3], a[4]);     // Sum(7)
    res[8] = fma52hi(res[8], a[3], a[4]);     // Sum(7)
    res[5] = fma52lo(res[5], a[0], a[5]);     // Sum(5)
    res[6] = fma52hi(res[6], a[0], a[5]);     // Sum(5)
    res[6] = fma52lo(res[6], a[1], a[5]);     // Sum(6)
    res[7] = fma52hi(res[7], a[1], a[5]);     // Sum(6)
    res[7] = fma52lo(res[7], a[2], a[5]);     // Sum(7)
    res[8] = fma52hi(res[8], a[2], a[5]);     // Sum(7)
    res[8] = fma52lo(res[8], a[3], a[5]);     // Sum(8)
    res[9] = fma52hi(res[9], a[3], a[5]);     // Sum(8)
    res[9] = fma52lo(res[9], a[4], a[5]);     // Sum(9)
    res[10] = fma52hi(res[10], a[4], a[5]);   // Sum(9)
    res[6] = fma52lo(res[6], a[0], a[6]);     // Sum(6)
    res[7] = fma52hi(res[7], a[0], a[6]);     // Sum(6)
    res[7] = fma52lo(res[7], a[1], a[6]);     // Sum(7)
    res[8] = fma52hi(res[8], a[1], a[6]);     // Sum(7)
    res[8] = fma52lo(res[8], a[2], a[6]);     // Sum(8)
    res[9] = fma52hi(res[9], a[2], a[6]);     // Sum(8)
    res[9] = fma52lo(res[9], a[3], a[6]);     // Sum(9)
    res[10] = fma52hi(res[10], a[3], a[6]);   // Sum(9)
    res[10] = fma52lo(res[10], a[4], a[6]);   // Sum(10)
    res[11] = fma52hi(res[11], a[4], a[6]);   // Sum(10)
    res[11] = fma52lo(res[11], a[5], a[6]);   // Sum(11)
    res[12] = fma52hi(res[12], a[5], a[6]);   // Sum(11)
    res[7] = fma52lo(res[7], a[0], a[7]);     // Sum(7)
    res[8] = fma52hi(res[8], a[0], a[7]);     // Sum(7)
    res[8] = fma52lo(res[8], a[1], a[7]);     // Sum(8)
    res[9] = fma52hi(res[9], a[1], a[7]);     // Sum(8)
    res[9] = fma52lo(res[9], a[2], a[7]);     // Sum(9)
    res[10] = fma52hi(res[10], a[2], a[7]);   // Sum(9)
    res[10] = fma52lo(res[10], a[3], a[7]);   // Sum(10)
    res[11] = fma52hi(res[11], a[3], a[7]);   // Sum(10)
    res[11] = fma52lo(res[11], a[4], a[7]);   // Sum(11)
    res[12] = fma52hi(res[12], a[4], a[7]);   // Sum(11)
    res[8] = fma52lo(res[8], a[0], a[8]);     // Sum(8)
    res[9] = fma52hi(res[9], a[0], a[8]);     // Sum(8)
    res[9] = fma52lo(res[9], a[1], a[8]);     // Sum(9)
    res[10] = fma52hi(res[10], a[1], a[8]);   // Sum(9)
    res[10] = fma52lo(res[10], a[2], a[8]);   // Sum(10)
    res[11] = fma52hi(res[11], a[2], a[8]);   // Sum(10)
    res[11] = fma52lo(res[11], a[3], a[8]);   // Sum(11)
    res[12] = fma52hi(res[12], a[3], a[8]);   // Sum(11)
    res[9] = fma52lo(res[9], a[0], a[9]);     // Sum(9)
    res[10] = fma52hi(res[10], a[0], a[9]);   // Sum(9)
    res[10] = fma52lo(res[10], a[1], a[9]);   // Sum(10)
    res[11] = fma52hi(res[11], a[1], a[9]);   // Sum(10)
    res[11] = fma52lo(res[11], a[2], a[9]);   // Sum(11)
    res[12] = fma52hi(res[12], a[2], a[9]);   // Sum(11)
    res[10] = fma52lo(res[10], a[0], a[10]);  // Sum(10)
    res[11] = fma52hi(res[11], a[0], a[10]);  // Sum(10)
    res[11] = fma52lo(res[11], a[1], a[10]);  // Sum(11)
    res[12] = fma52hi(res[12], a[1], a[10]);  // Sum(11)
    res[11] = fma52lo(res[11], a[0], a[11]);  // Sum(11)
    res[12] = fma52hi(res[12], a[0], a[11]);  // Sum(11)
    res[0] = add64(res[0], res[0]);           // Double(0)
    res[1] = add64(res[1], res[1]);           // Double(1)
    res[2] = add64(res[2], res[2]);           // Double(2)
    res[3] = add64(res[3], res[3]);           // Double(3)
    res[4] = add64(res[4], res[4]);           // Double(4)
    res[5] = add64(res[5], res[5]);           // Double(5)
    res[6] = add64(res[6], res[6]);           // Double(6)
    res[7] = add64(res[7], res[7]);           // Double(7)
    res[8] = add64(res[8], res[8]);           // Double(8)
    res[9] = add64(res[9], res[9]);           // Double(9)
    res[10] = add64(res[10], res[10]);        // Double(10)
    res[11] = add64(res[11], res[11]);        // Double(11)
    res[0] = fma52lo(res[0], a[0], a[0]);     // Add sqr(0)
    res[1] = fma52hi(res[1], a[0], a[0]);     // Add sqr(0)
    res[2] = fma52lo(res[2], a[1], a[1]);     // Add sqr(2)
    res[3] = fma52hi(res[3], a[1], a[1]);     // Add sqr(2)
    res[4] = fma52lo(res[4], a[2], a[2]);     // Add sqr(4)
    res[5] = fma52hi(res[5], a[2], a[2]);     // Add sqr(4)
    res[6] = fma52lo(res[6], a[3], a[3]);     // Add sqr(6)
    res[7] = fma52hi(res[7], a[3], a[3]);     // Add sqr(6)
    res[8] = fma52lo(res[8], a[4], a[4]);     // Add sqr(8)
    res[9] = fma52hi(res[9], a[4], a[4]);     // Add sqr(8)
    res[10] = fma52lo(res[10], a[5], a[5]);   // Add sqr(10)
    res[11] = fma52hi(res[11], a[5], a[5]);   // Add sqr(10)
    res[12] = fma52lo(res[12], a[5], a[7]);   // Sum(12)
    res[13] = fma52hi(res[13], a[5], a[7]);   // Sum(12)
    res[13] = fma52lo(res[13], a[6], a[7]);   // Sum(13)
    res[14] = fma52hi(res[14], a[6], a[7]);   // Sum(13)
    res[12] = fma52lo(res[12], a[4], a[8]);   // Sum(12)
    res[13] = fma52hi(res[13], a[4], a[8]);   // Sum(12)
    res[13] = fma52lo(res[13], a[5], a[8]);   // Sum(13)
    res[14] = fma52hi(res[14], a[5], a[8]);   // Sum(13)
    res[14] = fma52lo(res[14], a[6], a[8]);   // Sum(14)
    res[15] = fma52hi(res[15], a[6], a[8]);   // Sum(14)
    res[15] = fma52lo(res[15], a[7], a[8]);   // Sum(15)
    res[16] = fma52hi(res[16], a[7], a[8]);   // Sum(15)
    res[12] = fma52lo(res[12], a[3], a[9]);   // Sum(12)
    res[13] = fma52hi(res[13], a[3], a[9]);   // Sum(12)
    res[13] = fma52lo(res[13], a[4], a[9]);   // Sum(13)
    res[14] = fma52hi(res[14], a[4], a[9]);   // Sum(13)
    res[14] = fma52lo(res[14], a[5], a[9]);   // Sum(14)
    res[15] = fma52hi(res[15], a[5], a[9]);   // Sum(14)
    res[15] = fma52lo(res[15], a[6], a[9]);   // Sum(15)
    res[16] = fma52hi(res[16], a[6], a[9]);   // Sum(15)
    res[16] = fma52lo(res[16], a[7], a[9]);   // Sum(16)
    res[17] = fma52hi(res[17], a[7], a[9]);   // Sum(16)
    res[17] = fma52lo(res[17], a[8], a[9]);   // Sum(17)
    res[18] = fma52hi(res[18], a[8], a[9]);   // Sum(17)
    res[12] = fma52lo(res[12], a[2], a[10]);  // Sum(12)
    res[13] = fma52hi(res[13], a[2], a[10]);  // Sum(12)
    res[13] = fma52lo(res[13], a[3], a[10]);  // Sum(13)
    res[14] = fma52hi(res[14], a[3], a[10]);  // Sum(13)
    res[14] = fma52lo(res[14], a[4], a[10]);  // Sum(14)
    res[15] = fma52hi(res[15], a[4], a[10]);  // Sum(14)
    res[15] = fma52lo(res[15], a[5], a[10]);  // Sum(15)
    res[16] = fma52hi(res[16], a[5], a[10]);  // Sum(15)
    res[16] = fma52lo(res[16], a[6], a[10]);  // Sum(16)
    res[17] = fma52hi(res[17], a[6], a[10]);  // Sum(16)
    res[17] = fma52lo(res[17], a[7], a[10]);  // Sum(17)
    res[18] = fma52hi(res[18], a[7], a[10]);  // Sum(17)
    res[18] = fma52lo(res[18], a[8], a[10]);  // Sum(18)
    res[19] = fma52hi(res[19], a[8], a[10]);  // Sum(18)
    res[19] = fma52lo(res[19], a[9], a[10]);  // Sum(19)
    res[20] = fma52hi(res[20], a[9], a[10]);  // Sum(19)
    res[12] = fma52lo(res[12], a[1], a[11]);  // Sum(12)
    res[13] = fma52hi(res[13], a[1], a[11]);  // Sum(12)
    res[13] = fma52lo(res[13], a[2], a[11]);  // Sum(13)
    res[14] = fma52hi(res[14], a[2], a[11]);  // Sum(13)
    res[14] = fma52lo(res[14], a[3], a[11]);  // Sum(14)
    res[15] = fma52hi(res[15], a[3], a[11]);  // Sum(14)
    res[15] = fma52lo(res[15], a[4], a[11]);  // Sum(15)
    res[16] = fma52hi(res[16], a[4], a[11]);  // Sum(15)
    res[16] = fma52lo(res[16], a[5], a[11]);  // Sum(16)
    res[17] = fma52hi(res[17], a[5], a[11]);  // Sum(16)
    res[17] = fma52lo(res[17], a[6], a[11]);  // Sum(17)
    res[18] = fma52hi(res[18], a[6], a[11]);  // Sum(17)
    res[18] = fma52lo(res[18], a[7], a[11]);  // Sum(18)
    res[19] = fma52hi(res[19], a[7], a[11]);  // Sum(18)
    res[19] = fma52lo(res[19], a[8], a[11]);  // Sum(19)
    res[20] = fma52hi(res[20], a[8], a[11]);  // Sum(19)
    res[20] = fma52lo(res[20], a[9], a[11]);  // Sum(20)
    res[21] = fma52hi(res[21], a[9], a[11]);  // Sum(20)
    res[21] = fma52lo(res[21], a[10], a[11]); // Sum(21)
    res[22] = fma52hi(res[22], a[10], a[11]); // Sum(21)
    res[12] = fma52lo(res[12], a[0], a[12]);  // Sum(12)
    res[13] = fma52hi(res[13], a[0], a[12]);  // Sum(12)
    res[13] = fma52lo(res[13], a[1], a[12]);  // Sum(13)
    res[14] = fma52hi(res[14], a[1], a[12]);  // Sum(13)
    res[14] = fma52lo(res[14], a[2], a[12]);  // Sum(14)
    res[15] = fma52hi(res[15], a[2], a[12]);  // Sum(14)
    res[15] = fma52lo(res[15], a[3], a[12]);  // Sum(15)
    res[16] = fma52hi(res[16], a[3], a[12]);  // Sum(15)
    res[16] = fma52lo(res[16], a[4], a[12]);  // Sum(16)
    res[17] = fma52hi(res[17], a[4], a[12]);  // Sum(16)
    res[17] = fma52lo(res[17], a[5], a[12]);  // Sum(17)
    res[18] = fma52hi(res[18], a[5], a[12]);  // Sum(17)
    res[18] = fma52lo(res[18], a[6], a[12]);  // Sum(18)
    res[19] = fma52hi(res[19], a[6], a[12]);  // Sum(18)
    res[19] = fma52lo(res[19], a[7], a[12]);  // Sum(19)
    res[20] = fma52hi(res[20], a[7], a[12]);  // Sum(19)
    res[20] = fma52lo(res[20], a[8], a[12]);  // Sum(20)
    res[21] = fma52hi(res[21], a[8], a[12]);  // Sum(20)
    res[21] = fma52lo(res[21], a[9], a[12]);  // Sum(21)
    res[22] = fma52hi(res[22], a[9], a[12]);  // Sum(21)
    res[22] = fma52lo(res[22], a[10], a[12]); // Sum(22)
    res[23] = fma52hi(res[23], a[10], a[12]); // Sum(22)
    res[23] = fma52lo(res[23], a[11], a[12]); // Sum(23)
    res[24] = fma52hi(res[24], a[11], a[12]); // Sum(23)
    res[13] = fma52lo(res[13], a[0], a[13]);  // Sum(13)
    res[14] = fma52hi(res[14], a[0], a[13]);  // Sum(13)
    res[14] = fma52lo(res[14], a[1], a[13]);  // Sum(14)
    res[15] = fma52hi(res[15], a[1], a[13]);  // Sum(14)
    res[15] = fma52lo(res[15], a[2], a[13]);  // Sum(15)
    res[16] = fma52hi(res[16], a[2], a[13]);  // Sum(15)
    res[16] = fma52lo(res[16], a[3], a[13]);  // Sum(16)
    res[17] = fma52hi(res[17], a[3], a[13]);  // Sum(16)
    res[17] = fma52lo(res[17], a[4], a[13]);  // Sum(17)
    res[18] = fma52hi(res[18], a[4], a[13]);  // Sum(17)
    res[18] = fma52lo(res[18], a[5], a[13]);  // Sum(18)
    res[19] = fma52hi(res[19], a[5], a[13]);  // Sum(18)
    res[19] = fma52lo(res[19], a[6], a[13]);  // Sum(19)
    res[20] = fma52hi(res[20], a[6], a[13]);  // Sum(19)
    res[20] = fma52lo(res[20], a[7], a[13]);  // Sum(20)
    res[21] = fma52hi(res[21], a[7], a[13]);  // Sum(20)
    res[21] = fma52lo(res[21], a[8], a[13]);  // Sum(21)
    res[22] = fma52hi(res[22], a[8], a[13]);  // Sum(21)
    res[22] = fma52lo(res[22], a[9], a[13]);  // Sum(22)
    res[23] = fma52hi(res[23], a[9], a[13]);  // Sum(22)
    res[23] = fma52lo(res[23], a[10], a[13]); // Sum(23)
    res[24] = fma52hi(res[24], a[10], a[13]); // Sum(23)
    res[14] = fma52lo(res[14], a[0], a[14]);  // Sum(14)
    res[15] = fma52hi(res[15], a[0], a[14]);  // Sum(14)
    res[15] = fma52lo(res[15], a[1], a[14]);  // Sum(15)
    res[16] = fma52hi(res[16], a[1], a[14]);  // Sum(15)
    res[16] = fma52lo(res[16], a[2], a[14]);  // Sum(16)
    res[17] = fma52hi(res[17], a[2], a[14]);  // Sum(16)
    res[17] = fma52lo(res[17], a[3], a[14]);  // Sum(17)
    res[18] = fma52hi(res[18], a[3], a[14]);  // Sum(17)
    res[18] = fma52lo(res[18], a[4], a[14]);  // Sum(18)
    res[19] = fma52hi(res[19], a[4], a[14]);  // Sum(18)
    res[19] = fma52lo(res[19], a[5], a[14]);  // Sum(19)
    res[20] = fma52hi(res[20], a[5], a[14]);  // Sum(19)
    res[20] = fma52lo(res[20], a[6], a[14]);  // Sum(20)
    res[21] = fma52hi(res[21], a[6], a[14]);  // Sum(20)
    res[21] = fma52lo(res[21], a[7], a[14]);  // Sum(21)
    res[22] = fma52hi(res[22], a[7], a[14]);  // Sum(21)
    res[22] = fma52lo(res[22], a[8], a[14]);  // Sum(22)
    res[23] = fma52hi(res[23], a[8], a[14]);  // Sum(22)
    res[23] = fma52lo(res[23], a[9], a[14]);  // Sum(23)
    res[24] = fma52hi(res[24], a[9], a[14]);  // Sum(23)
    res[15] = fma52lo(res[15], a[0], a[15]);  // Sum(15)
    res[16] = fma52hi(res[16], a[0], a[15]);  // Sum(15)
    res[16] = fma52lo(res[16], a[1], a[15]);  // Sum(16)
    res[17] = fma52hi(res[17], a[1], a[15]);  // Sum(16)
    res[17] = fma52lo(res[17], a[2], a[15]);  // Sum(17)
    res[18] = fma52hi(res[18], a[2], a[15]);  // Sum(17)
    res[18] = fma52lo(res[18], a[3], a[15]);  // Sum(18)
    res[19] = fma52hi(res[19], a[3], a[15]);  // Sum(18)
    res[19] = fma52lo(res[19], a[4], a[15]);  // Sum(19)
    res[20] = fma52hi(res[20], a[4], a[15]);  // Sum(19)
    res[20] = fma52lo(res[20], a[5], a[15]);  // Sum(20)
    res[21] = fma52hi(res[21], a[5], a[15]);  // Sum(20)
    res[21] = fma52lo(res[21], a[6], a[15]);  // Sum(21)
    res[22] = fma52hi(res[22], a[6], a[15]);  // Sum(21)
    res[22] = fma52lo(res[22], a[7], a[15]);  // Sum(22)
    res[23] = fma52hi(res[23], a[7], a[15]);  // Sum(22)
    res[23] = fma52lo(res[23], a[8], a[15]);  // Sum(23)
    res[24] = fma52hi(res[24], a[8], a[15]);  // Sum(23)
    res[16] = fma52lo(res[16], a[0], a[16]);  // Sum(16)
    res[17] = fma52hi(res[17], a[0], a[16]);  // Sum(16)
    res[17] = fma52lo(res[17], a[1], a[16]);  // Sum(17)
    res[18] = fma52hi(res[18], a[1], a[16]);  // Sum(17)
    res[18] = fma52lo(res[18], a[2], a[16]);  // Sum(18)
    res[19] = fma52hi(res[19], a[2], a[16]);  // Sum(18)
    res[19] = fma52lo(res[19], a[3], a[16]);  // Sum(19)
    res[20] = fma52hi(res[20], a[3], a[16]);  // Sum(19)
    res[20] = fma52lo(res[20], a[4], a[16]);  // Sum(20)
    res[21] = fma52hi(res[21], a[4], a[16]);  // Sum(20)
    res[21] = fma52lo(res[21], a[5], a[16]);  // Sum(21)
    res[22] = fma52hi(res[22], a[5], a[16]);  // Sum(21)
    res[22] = fma52lo(res[22], a[6], a[16]);  // Sum(22)
    res[23] = fma52hi(res[23], a[6], a[16]);  // Sum(22)
    res[23] = fma52lo(res[23], a[7], a[16]);  // Sum(23)
    res[24] = fma52hi(res[24], a[7], a[16]);  // Sum(23)
    res[17] = fma52lo(res[17], a[0], a[17]);  // Sum(17)
    res[18] = fma52hi(res[18], a[0], a[17]);  // Sum(17)
    res[18] = fma52lo(res[18], a[1], a[17]);  // Sum(18)
    res[19] = fma52hi(res[19], a[1], a[17]);  // Sum(18)
    res[19] = fma52lo(res[19], a[2], a[17]);  // Sum(19)
    res[20] = fma52hi(res[20], a[2], a[17]);  // Sum(19)
    res[20] = fma52lo(res[20], a[3], a[17]);  // Sum(20)
    res[21] = fma52hi(res[21], a[3], a[17]);  // Sum(20)
    res[21] = fma52lo(res[21], a[4], a[17]);  // Sum(21)
    res[22] = fma52hi(res[22], a[4], a[17]);  // Sum(21)
    res[22] = fma52lo(res[22], a[5], a[17]);  // Sum(22)
    res[23] = fma52hi(res[23], a[5], a[17]);  // Sum(22)
    res[23] = fma52lo(res[23], a[6], a[17]);  // Sum(23)
    res[24] = fma52hi(res[24], a[6], a[17]);  // Sum(23)
    res[18] = fma52lo(res[18], a[0], a[18]);  // Sum(18)
    res[19] = fma52hi(res[19], a[0], a[18]);  // Sum(18)
    res[19] = fma52lo(res[19], a[1], a[18]);  // Sum(19)
    res[20] = fma52hi(res[20], a[1], a[18]);  // Sum(19)
    res[20] = fma52lo(res[20], a[2], a[18]);  // Sum(20)
    res[21] = fma52hi(res[21], a[2], a[18]);  // Sum(20)
    res[21] = fma52lo(res[21], a[3], a[18]);  // Sum(21)
    res[22] = fma52hi(res[22], a[3], a[18]);  // Sum(21)
    res[22] = fma52lo(res[22], a[4], a[18]);  // Sum(22)
    res[23] = fma52hi(res[23], a[4], a[18]);  // Sum(22)
    res[23] = fma52lo(res[23], a[5], a[18]);  // Sum(23)
    res[24] = fma52hi(res[24], a[5], a[18]);  // Sum(23)
    res[19] = fma52lo(res[19], a[0], a[19]);  // Sum(19)
    res[20] = fma52hi(res[20], a[0], a[19]);  // Sum(19)
    res[20] = fma52lo(res[20], a[1], a[19]);  // Sum(20)
    res[21] = fma52hi(res[21], a[1], a[19]);  // Sum(20)
    res[21] = fma52lo(res[21], a[2], a[19]);  // Sum(21)
    res[22] = fma52hi(res[22], a[2], a[19]);  // Sum(21)
    res[22] = fma52lo(res[22], a[3], a[19]);  // Sum(22)
    res[23] = fma52hi(res[23], a[3], a[19]);  // Sum(22)
    res[23] = fma52lo(res[23], a[4], a[19]);  // Sum(23)
    res[24] = fma52hi(res[24], a[4], a[19]);  // Sum(23)
    res[20] = fma52lo(res[20], a[0], a[20]);  // Sum(20)
    res[21] = fma52hi(res[21], a[0], a[20]);  // Sum(20)
    res[21] = fma52lo(res[21], a[1], a[20]);  // Sum(21)
    res[22] = fma52hi(res[22], a[1], a[20]);  // Sum(21)
    res[22] = fma52lo(res[22], a[2], a[20]);  // Sum(22)
    res[23] = fma52hi(res[23], a[2], a[20]);  // Sum(22)
    res[23] = fma52lo(res[23], a[3], a[20]);  // Sum(23)
    res[24] = fma52hi(res[24], a[3], a[20]);  // Sum(23)
    res[21] = fma52lo(res[21], a[0], a[21]);  // Sum(21)
    res[22] = fma52hi(res[22], a[0], a[21]);  // Sum(21)
    res[22] = fma52lo(res[22], a[1], a[21]);  // Sum(22)
    res[23] = fma52hi(res[23], a[1], a[21]);  // Sum(22)
    res[23] = fma52lo(res[23], a[2], a[21]);  // Sum(23)
    res[24] = fma52hi(res[24], a[2], a[21]);  // Sum(23)
    res[22] = fma52lo(res[22], a[0], a[22]);  // Sum(22)
    res[23] = fma52hi(res[23], a[0], a[22]);  // Sum(22)
    res[23] = fma52lo(res[23], a[1], a[22]);  // Sum(23)
    res[24] = fma52hi(res[24], a[1], a[22]);  // Sum(23)
    res[23] = fma52lo(res[23], a[0], a[23]);  // Sum(23)
    res[24] = fma52hi(res[24], a[0], a[23]);  // Sum(23)
    res[12] = add64(res[12], res[12]);        // Double(12)
    res[13] = add64(res[13], res[13]);        // Double(13)
    res[14] = add64(res[14], res[14]);        // Double(14)
    res[15] = add64(res[15], res[15]);        // Double(15)
    res[16] = add64(res[16], res[16]);        // Double(16)
    res[17] = add64(res[17], res[17]);        // Double(17)
    res[18] = add64(res[18], res[18]);        // Double(18)
    res[19] = add64(res[19], res[19]);        // Double(19)
    res[20] = add64(res[20], res[20]);        // Double(20)
    res[21] = add64(res[21], res[21]);        // Double(21)
    res[22] = add64(res[22], res[22]);        // Double(22)
    res[23] = add64(res[23], res[23]);        // Double(23)
    res[12] = fma52lo(res[12], a[6], a[6]);   // Add sqr(12)
    res[13] = fma52hi(res[13], a[6], a[6]);   // Add sqr(12)
    res[14] = fma52lo(res[14], a[7], a[7]);   // Add sqr(14)
    res[15] = fma52hi(res[15], a[7], a[7]);   // Add sqr(14)
    res[16] = fma52lo(res[16], a[8], a[8]);   // Add sqr(16)
    res[17] = fma52hi(res[17], a[8], a[8]);   // Add sqr(16)
    res[18] = fma52lo(res[18], a[9], a[9]);   // Add sqr(18)
    res[19] = fma52hi(res[19], a[9], a[9]);   // Add sqr(18)
    res[20] = fma52lo(res[20], a[10], a[10]); // Add sqr(20)
    res[21] = fma52hi(res[21], a[10], a[10]); // Add sqr(20)
    res[22] = fma52lo(res[22], a[11], a[11]); // Add sqr(22)
    res[23] = fma52hi(res[23], a[11], a[11]); // Add sqr(22)
    res[24] = fma52lo(res[24], a[11], a[13]); // Sum(24)
    res[25] = fma52hi(res[25], a[11], a[13]); // Sum(24)
    res[25] = fma52lo(res[25], a[12], a[13]); // Sum(25)
    res[26] = fma52hi(res[26], a[12], a[13]); // Sum(25)
    res[24] = fma52lo(res[24], a[10], a[14]); // Sum(24)
    res[25] = fma52hi(res[25], a[10], a[14]); // Sum(24)
    res[25] = fma52lo(res[25], a[11], a[14]); // Sum(25)
    res[26] = fma52hi(res[26], a[11], a[14]); // Sum(25)
    res[26] = fma52lo(res[26], a[12], a[14]); // Sum(26)
    res[27] = fma52hi(res[27], a[12], a[14]); // Sum(26)
    res[27] = fma52lo(res[27], a[13], a[14]); // Sum(27)
    res[28] = fma52hi(res[28], a[13], a[14]); // Sum(27)
    res[24] = fma52lo(res[24], a[9], a[15]);  // Sum(24)
    res[25] = fma52hi(res[25], a[9], a[15]);  // Sum(24)
    res[25] = fma52lo(res[25], a[10], a[15]); // Sum(25)
    res[26] = fma52hi(res[26], a[10], a[15]); // Sum(25)
    res[26] = fma52lo(res[26], a[11], a[15]); // Sum(26)
    res[27] = fma52hi(res[27], a[11], a[15]); // Sum(26)
    res[27] = fma52lo(res[27], a[12], a[15]); // Sum(27)
    res[28] = fma52hi(res[28], a[12], a[15]); // Sum(27)
    res[28] = fma52lo(res[28], a[13], a[15]); // Sum(28)
    res[29] = fma52hi(res[29], a[13], a[15]); // Sum(28)
    res[29] = fma52lo(res[29], a[14], a[15]); // Sum(29)
    res[30] = fma52hi(res[30], a[14], a[15]); // Sum(29)
    res[24] = fma52lo(res[24], a[8], a[16]);  // Sum(24)
    res[25] = fma52hi(res[25], a[8], a[16]);  // Sum(24)
    res[25] = fma52lo(res[25], a[9], a[16]);  // Sum(25)
    res[26] = fma52hi(res[26], a[9], a[16]);  // Sum(25)
    res[26] = fma52lo(res[26], a[10], a[16]); // Sum(26)
    res[27] = fma52hi(res[27], a[10], a[16]); // Sum(26)
    res[27] = fma52lo(res[27], a[11], a[16]); // Sum(27)
    res[28] = fma52hi(res[28], a[11], a[16]); // Sum(27)
    res[28] = fma52lo(res[28], a[12], a[16]); // Sum(28)
    res[29] = fma52hi(res[29], a[12], a[16]); // Sum(28)
    res[29] = fma52lo(res[29], a[13], a[16]); // Sum(29)
    res[30] = fma52hi(res[30], a[13], a[16]); // Sum(29)
    res[30] = fma52lo(res[30], a[14], a[16]); // Sum(30)
    res[31] = fma52hi(res[31], a[14], a[16]); // Sum(30)
    res[31] = fma52lo(res[31], a[15], a[16]); // Sum(31)
    res[32] = fma52hi(res[32], a[15], a[16]); // Sum(31)
    res[24] = fma52lo(res[24], a[7], a[17]);  // Sum(24)
    res[25] = fma52hi(res[25], a[7], a[17]);  // Sum(24)
    res[25] = fma52lo(res[25], a[8], a[17]);  // Sum(25)
    res[26] = fma52hi(res[26], a[8], a[17]);  // Sum(25)
    res[26] = fma52lo(res[26], a[9], a[17]);  // Sum(26)
    res[27] = fma52hi(res[27], a[9], a[17]);  // Sum(26)
    res[27] = fma52lo(res[27], a[10], a[17]); // Sum(27)
    res[28] = fma52hi(res[28], a[10], a[17]); // Sum(27)
    res[28] = fma52lo(res[28], a[11], a[17]); // Sum(28)
    res[29] = fma52hi(res[29], a[11], a[17]); // Sum(28)
    res[29] = fma52lo(res[29], a[12], a[17]); // Sum(29)
    res[30] = fma52hi(res[30], a[12], a[17]); // Sum(29)
    res[30] = fma52lo(res[30], a[13], a[17]); // Sum(30)
    res[31] = fma52hi(res[31], a[13], a[17]); // Sum(30)
    res[31] = fma52lo(res[31], a[14], a[17]); // Sum(31)
    res[32] = fma52hi(res[32], a[14], a[17]); // Sum(31)
    res[32] = fma52lo(res[32], a[15], a[17]); // Sum(32)
    res[33] = fma52hi(res[33], a[15], a[17]); // Sum(32)
    res[33] = fma52lo(res[33], a[16], a[17]); // Sum(33)
    res[34] = fma52hi(res[34], a[16], a[17]); // Sum(33)
    res[24] = fma52lo(res[24], a[6], a[18]);  // Sum(24)
    res[25] = fma52hi(res[25], a[6], a[18]);  // Sum(24)
    res[25] = fma52lo(res[25], a[7], a[18]);  // Sum(25)
    res[26] = fma52hi(res[26], a[7], a[18]);  // Sum(25)
    res[26] = fma52lo(res[26], a[8], a[18]);  // Sum(26)
    res[27] = fma52hi(res[27], a[8], a[18]);  // Sum(26)
    res[27] = fma52lo(res[27], a[9], a[18]);  // Sum(27)
    res[28] = fma52hi(res[28], a[9], a[18]);  // Sum(27)
    res[28] = fma52lo(res[28], a[10], a[18]); // Sum(28)
    res[29] = fma52hi(res[29], a[10], a[18]); // Sum(28)
    res[29] = fma52lo(res[29], a[11], a[18]); // Sum(29)
    res[30] = fma52hi(res[30], a[11], a[18]); // Sum(29)
    res[30] = fma52lo(res[30], a[12], a[18]); // Sum(30)
    res[31] = fma52hi(res[31], a[12], a[18]); // Sum(30)
    res[31] = fma52lo(res[31], a[13], a[18]); // Sum(31)
    res[32] = fma52hi(res[32], a[13], a[18]); // Sum(31)
    res[32] = fma52lo(res[32], a[14], a[18]); // Sum(32)
    res[33] = fma52hi(res[33], a[14], a[18]); // Sum(32)
    res[33] = fma52lo(res[33], a[15], a[18]); // Sum(33)
    res[34] = fma52hi(res[34], a[15], a[18]); // Sum(33)
    res[34] = fma52lo(res[34], a[16], a[18]); // Sum(34)
    res[35] = fma52hi(res[35], a[16], a[18]); // Sum(34)
    res[35] = fma52lo(res[35], a[17], a[18]); // Sum(35)
    res[36] = fma52hi(res[36], a[17], a[18]); // Sum(35)
    res[24] = fma52lo(res[24], a[5], a[19]);  // Sum(24)
    res[25] = fma52hi(res[25], a[5], a[19]);  // Sum(24)
    res[25] = fma52lo(res[25], a[6], a[19]);  // Sum(25)
    res[26] = fma52hi(res[26], a[6], a[19]);  // Sum(25)
    res[26] = fma52lo(res[26], a[7], a[19]);  // Sum(26)
    res[27] = fma52hi(res[27], a[7], a[19]);  // Sum(26)
    res[27] = fma52lo(res[27], a[8], a[19]);  // Sum(27)
    res[28] = fma52hi(res[28], a[8], a[19]);  // Sum(27)
    res[28] = fma52lo(res[28], a[9], a[19]);  // Sum(28)
    res[29] = fma52hi(res[29], a[9], a[19]);  // Sum(28)
    res[29] = fma52lo(res[29], a[10], a[19]); // Sum(29)
    res[30] = fma52hi(res[30], a[10], a[19]); // Sum(29)
    res[30] = fma52lo(res[30], a[11], a[19]); // Sum(30)
    res[31] = fma52hi(res[31], a[11], a[19]); // Sum(30)
    res[31] = fma52lo(res[31], a[12], a[19]); // Sum(31)
    res[32] = fma52hi(res[32], a[12], a[19]); // Sum(31)
    res[32] = fma52lo(res[32], a[13], a[19]); // Sum(32)
    res[33] = fma52hi(res[33], a[13], a[19]); // Sum(32)
    res[33] = fma52lo(res[33], a[14], a[19]); // Sum(33)
    res[34] = fma52hi(res[34], a[14], a[19]); // Sum(33)
    res[34] = fma52lo(res[34], a[15], a[19]); // Sum(34)
    res[35] = fma52hi(res[35], a[15], a[19]); // Sum(34)
    res[35] = fma52lo(res[35], a[16], a[19]); // Sum(35)
    res[36] = fma52hi(res[36], a[16], a[19]); // Sum(35)
    res[24] = fma52lo(res[24], a[4], a[20]);  // Sum(24)
    res[25] = fma52hi(res[25], a[4], a[20]);  // Sum(24)
    res[25] = fma52lo(res[25], a[5], a[20]);  // Sum(25)
    res[26] = fma52hi(res[26], a[5], a[20]);  // Sum(25)
    res[26] = fma52lo(res[26], a[6], a[20]);  // Sum(26)
    res[27] = fma52hi(res[27], a[6], a[20]);  // Sum(26)
    res[27] = fma52lo(res[27], a[7], a[20]);  // Sum(27)
    res[28] = fma52hi(res[28], a[7], a[20]);  // Sum(27)
    res[28] = fma52lo(res[28], a[8], a[20]);  // Sum(28)
    res[29] = fma52hi(res[29], a[8], a[20]);  // Sum(28)
    res[29] = fma52lo(res[29], a[9], a[20]);  // Sum(29)
    res[30] = fma52hi(res[30], a[9], a[20]);  // Sum(29)
    res[30] = fma52lo(res[30], a[10], a[20]); // Sum(30)
    res[31] = fma52hi(res[31], a[10], a[20]); // Sum(30)
    res[31] = fma52lo(res[31], a[11], a[20]); // Sum(31)
    res[32] = fma52hi(res[32], a[11], a[20]); // Sum(31)
    res[32] = fma52lo(res[32], a[12], a[20]); // Sum(32)
    res[33] = fma52hi(res[33], a[12], a[20]); // Sum(32)
    res[33] = fma52lo(res[33], a[13], a[20]); // Sum(33)
    res[34] = fma52hi(res[34], a[13], a[20]); // Sum(33)
    res[34] = fma52lo(res[34], a[14], a[20]); // Sum(34)
    res[35] = fma52hi(res[35], a[14], a[20]); // Sum(34)
    res[35] = fma52lo(res[35], a[15], a[20]); // Sum(35)
    res[36] = fma52hi(res[36], a[15], a[20]); // Sum(35)
    res[24] = fma52lo(res[24], a[3], a[21]);  // Sum(24)
    res[25] = fma52hi(res[25], a[3], a[21]);  // Sum(24)
    res[25] = fma52lo(res[25], a[4], a[21]);  // Sum(25)
    res[26] = fma52hi(res[26], a[4], a[21]);  // Sum(25)
    res[26] = fma52lo(res[26], a[5], a[21]);  // Sum(26)
    res[27] = fma52hi(res[27], a[5], a[21]);  // Sum(26)
    res[27] = fma52lo(res[27], a[6], a[21]);  // Sum(27)
    res[28] = fma52hi(res[28], a[6], a[21]);  // Sum(27)
    res[28] = fma52lo(res[28], a[7], a[21]);  // Sum(28)
    res[29] = fma52hi(res[29], a[7], a[21]);  // Sum(28)
    res[29] = fma52lo(res[29], a[8], a[21]);  // Sum(29)
    res[30] = fma52hi(res[30], a[8], a[21]);  // Sum(29)
    res[30] = fma52lo(res[30], a[9], a[21]);  // Sum(30)
    res[31] = fma52hi(res[31], a[9], a[21]);  // Sum(30)
    res[31] = fma52lo(res[31], a[10], a[21]); // Sum(31)
    res[32] = fma52hi(res[32], a[10], a[21]); // Sum(31)
    res[32] = fma52lo(res[32], a[11], a[21]); // Sum(32)
    res[33] = fma52hi(res[33], a[11], a[21]); // Sum(32)
    res[33] = fma52lo(res[33], a[12], a[21]); // Sum(33)
    res[34] = fma52hi(res[34], a[12], a[21]); // Sum(33)
    res[34] = fma52lo(res[34], a[13], a[21]); // Sum(34)
    res[35] = fma52hi(res[35], a[13], a[21]); // Sum(34)
    res[35] = fma52lo(res[35], a[14], a[21]); // Sum(35)
    res[36] = fma52hi(res[36], a[14], a[21]); // Sum(35)
    res[24] = fma52lo(res[24], a[2], a[22]);  // Sum(24)
    res[25] = fma52hi(res[25], a[2], a[22]);  // Sum(24)
    res[25] = fma52lo(res[25], a[3], a[22]);  // Sum(25)
    res[26] = fma52hi(res[26], a[3], a[22]);  // Sum(25)
    res[26] = fma52lo(res[26], a[4], a[22]);  // Sum(26)
    res[27] = fma52hi(res[27], a[4], a[22]);  // Sum(26)
    res[27] = fma52lo(res[27], a[5], a[22]);  // Sum(27)
    res[28] = fma52hi(res[28], a[5], a[22]);  // Sum(27)
    res[28] = fma52lo(res[28], a[6], a[22]);  // Sum(28)
    res[29] = fma52hi(res[29], a[6], a[22]);  // Sum(28)
    res[29] = fma52lo(res[29], a[7], a[22]);  // Sum(29)
    res[30] = fma52hi(res[30], a[7], a[22]);  // Sum(29)
    res[30] = fma52lo(res[30], a[8], a[22]);  // Sum(30)
    res[31] = fma52hi(res[31], a[8], a[22]);  // Sum(30)
    res[31] = fma52lo(res[31], a[9], a[22]);  // Sum(31)
    res[32] = fma52hi(res[32], a[9], a[22]);  // Sum(31)
    res[32] = fma52lo(res[32], a[10], a[22]); // Sum(32)
    res[33] = fma52hi(res[33], a[10], a[22]); // Sum(32)
    res[33] = fma52lo(res[33], a[11], a[22]); // Sum(33)
    res[34] = fma52hi(res[34], a[11], a[22]); // Sum(33)
    res[34] = fma52lo(res[34], a[12], a[22]); // Sum(34)
    res[35] = fma52hi(res[35], a[12], a[22]); // Sum(34)
    res[35] = fma52lo(res[35], a[13], a[22]); // Sum(35)
    res[36] = fma52hi(res[36], a[13], a[22]); // Sum(35)
    res[24] = fma52lo(res[24], a[1], a[23]);  // Sum(24)
    res[25] = fma52hi(res[25], a[1], a[23]);  // Sum(24)
    res[25] = fma52lo(res[25], a[2], a[23]);  // Sum(25)
    res[26] = fma52hi(res[26], a[2], a[23]);  // Sum(25)
    res[26] = fma52lo(res[26], a[3], a[23]);  // Sum(26)
    res[27] = fma52hi(res[27], a[3], a[23]);  // Sum(26)
    res[27] = fma52lo(res[27], a[4], a[23]);  // Sum(27)
    res[28] = fma52hi(res[28], a[4], a[23]);  // Sum(27)
    res[28] = fma52lo(res[28], a[5], a[23]);  // Sum(28)
    res[29] = fma52hi(res[29], a[5], a[23]);  // Sum(28)
    res[29] = fma52lo(res[29], a[6], a[23]);  // Sum(29)
    res[30] = fma52hi(res[30], a[6], a[23]);  // Sum(29)
    res[30] = fma52lo(res[30], a[7], a[23]);  // Sum(30)
    res[31] = fma52hi(res[31], a[7], a[23]);  // Sum(30)
    res[31] = fma52lo(res[31], a[8], a[23]);  // Sum(31)
    res[32] = fma52hi(res[32], a[8], a[23]);  // Sum(31)
    res[32] = fma52lo(res[32], a[9], a[23]);  // Sum(32)
    res[33] = fma52hi(res[33], a[9], a[23]);  // Sum(32)
    res[33] = fma52lo(res[33], a[10], a[23]); // Sum(33)
    res[34] = fma52hi(res[34], a[10], a[23]); // Sum(33)
    res[34] = fma52lo(res[34], a[11], a[23]); // Sum(34)
    res[35] = fma52hi(res[35], a[11], a[23]); // Sum(34)
    res[35] = fma52lo(res[35], a[12], a[23]); // Sum(35)
    res[36] = fma52hi(res[36], a[12], a[23]); // Sum(35)
    res[24] = fma52lo(res[24], a[0], a[24]);  // Sum(24)
    res[25] = fma52hi(res[25], a[0], a[24]);  // Sum(24)
    res[25] = fma52lo(res[25], a[1], a[24]);  // Sum(25)
    res[26] = fma52hi(res[26], a[1], a[24]);  // Sum(25)
    res[26] = fma52lo(res[26], a[2], a[24]);  // Sum(26)
    res[27] = fma52hi(res[27], a[2], a[24]);  // Sum(26)
    res[27] = fma52lo(res[27], a[3], a[24]);  // Sum(27)
    res[28] = fma52hi(res[28], a[3], a[24]);  // Sum(27)
    res[28] = fma52lo(res[28], a[4], a[24]);  // Sum(28)
    res[29] = fma52hi(res[29], a[4], a[24]);  // Sum(28)
    res[29] = fma52lo(res[29], a[5], a[24]);  // Sum(29)
    res[30] = fma52hi(res[30], a[5], a[24]);  // Sum(29)
    res[30] = fma52lo(res[30], a[6], a[24]);  // Sum(30)
    res[31] = fma52hi(res[31], a[6], a[24]);  // Sum(30)
    res[31] = fma52lo(res[31], a[7], a[24]);  // Sum(31)
    res[32] = fma52hi(res[32], a[7], a[24]);  // Sum(31)
    res[32] = fma52lo(res[32], a[8], a[24]);  // Sum(32)
    res[33] = fma52hi(res[33], a[8], a[24]);  // Sum(32)
    res[33] = fma52lo(res[33], a[9], a[24]);  // Sum(33)
    res[34] = fma52hi(res[34], a[9], a[24]);  // Sum(33)
    res[34] = fma52lo(res[34], a[10], a[24]); // Sum(34)
    res[35] = fma52hi(res[35], a[10], a[24]); // Sum(34)
    res[35] = fma52lo(res[35], a[11], a[24]); // Sum(35)
    res[36] = fma52hi(res[36], a[11], a[24]); // Sum(35)
    res[25] = fma52lo(res[25], a[0], a[25]);  // Sum(25)
    res[26] = fma52hi(res[26], a[0], a[25]);  // Sum(25)
    res[26] = fma52lo(res[26], a[1], a[25]);  // Sum(26)
    res[27] = fma52hi(res[27], a[1], a[25]);  // Sum(26)
    res[27] = fma52lo(res[27], a[2], a[25]);  // Sum(27)
    res[28] = fma52hi(res[28], a[2], a[25]);  // Sum(27)
    res[28] = fma52lo(res[28], a[3], a[25]);  // Sum(28)
    res[29] = fma52hi(res[29], a[3], a[25]);  // Sum(28)
    res[29] = fma52lo(res[29], a[4], a[25]);  // Sum(29)
    res[30] = fma52hi(res[30], a[4], a[25]);  // Sum(29)
    res[30] = fma52lo(res[30], a[5], a[25]);  // Sum(30)
    res[31] = fma52hi(res[31], a[5], a[25]);  // Sum(30)
    res[31] = fma52lo(res[31], a[6], a[25]);  // Sum(31)
    res[32] = fma52hi(res[32], a[6], a[25]);  // Sum(31)
    res[32] = fma52lo(res[32], a[7], a[25]);  // Sum(32)
    res[33] = fma52hi(res[33], a[7], a[25]);  // Sum(32)
    res[33] = fma52lo(res[33], a[8], a[25]);  // Sum(33)
    res[34] = fma52hi(res[34], a[8], a[25]);  // Sum(33)
    res[34] = fma52lo(res[34], a[9], a[25]);  // Sum(34)
    res[35] = fma52hi(res[35], a[9], a[25]);  // Sum(34)
    res[35] = fma52lo(res[35], a[10], a[25]); // Sum(35)
    res[36] = fma52hi(res[36], a[10], a[25]); // Sum(35)
    res[26] = fma52lo(res[26], a[0], a[26]);  // Sum(26)
    res[27] = fma52hi(res[27], a[0], a[26]);  // Sum(26)
    res[27] = fma52lo(res[27], a[1], a[26]);  // Sum(27)
    res[28] = fma52hi(res[28], a[1], a[26]);  // Sum(27)
    res[28] = fma52lo(res[28], a[2], a[26]);  // Sum(28)
    res[29] = fma52hi(res[29], a[2], a[26]);  // Sum(28)
    res[29] = fma52lo(res[29], a[3], a[26]);  // Sum(29)
    res[30] = fma52hi(res[30], a[3], a[26]);  // Sum(29)
    res[30] = fma52lo(res[30], a[4], a[26]);  // Sum(30)
    res[31] = fma52hi(res[31], a[4], a[26]);  // Sum(30)
    res[31] = fma52lo(res[31], a[5], a[26]);  // Sum(31)
    res[32] = fma52hi(res[32], a[5], a[26]);  // Sum(31)
    res[32] = fma52lo(res[32], a[6], a[26]);  // Sum(32)
    res[33] = fma52hi(res[33], a[6], a[26]);  // Sum(32)
    res[33] = fma52lo(res[33], a[7], a[26]);  // Sum(33)
    res[34] = fma52hi(res[34], a[7], a[26]);  // Sum(33)
    res[34] = fma52lo(res[34], a[8], a[26]);  // Sum(34)
    res[35] = fma52hi(res[35], a[8], a[26]);  // Sum(34)
    res[35] = fma52lo(res[35], a[9], a[26]);  // Sum(35)
    res[36] = fma52hi(res[36], a[9], a[26]);  // Sum(35)
    res[27] = fma52lo(res[27], a[0], a[27]);  // Sum(27)
    res[28] = fma52hi(res[28], a[0], a[27]);  // Sum(27)
    res[28] = fma52lo(res[28], a[1], a[27]);  // Sum(28)
    res[29] = fma52hi(res[29], a[1], a[27]);  // Sum(28)
    res[29] = fma52lo(res[29], a[2], a[27]);  // Sum(29)
    res[30] = fma52hi(res[30], a[2], a[27]);  // Sum(29)
    res[30] = fma52lo(res[30], a[3], a[27]);  // Sum(30)
    res[31] = fma52hi(res[31], a[3], a[27]);  // Sum(30)
    res[31] = fma52lo(res[31], a[4], a[27]);  // Sum(31)
    res[32] = fma52hi(res[32], a[4], a[27]);  // Sum(31)
    res[32] = fma52lo(res[32], a[5], a[27]);  // Sum(32)
    res[33] = fma52hi(res[33], a[5], a[27]);  // Sum(32)
    res[33] = fma52lo(res[33], a[6], a[27]);  // Sum(33)
    res[34] = fma52hi(res[34], a[6], a[27]);  // Sum(33)
    res[34] = fma52lo(res[34], a[7], a[27]);  // Sum(34)
    res[35] = fma52hi(res[35], a[7], a[27]);  // Sum(34)
    res[35] = fma52lo(res[35], a[8], a[27]);  // Sum(35)
    res[36] = fma52hi(res[36], a[8], a[27]);  // Sum(35)
    res[28] = fma52lo(res[28], a[0], a[28]);  // Sum(28)
    res[29] = fma52hi(res[29], a[0], a[28]);  // Sum(28)
    res[29] = fma52lo(res[29], a[1], a[28]);  // Sum(29)
    res[30] = fma52hi(res[30], a[1], a[28]);  // Sum(29)
    res[30] = fma52lo(res[30], a[2], a[28]);  // Sum(30)
    res[31] = fma52hi(res[31], a[2], a[28]);  // Sum(30)
    res[31] = fma52lo(res[31], a[3], a[28]);  // Sum(31)
    res[32] = fma52hi(res[32], a[3], a[28]);  // Sum(31)
    res[32] = fma52lo(res[32], a[4], a[28]);  // Sum(32)
    res[33] = fma52hi(res[33], a[4], a[28]);  // Sum(32)
    res[33] = fma52lo(res[33], a[5], a[28]);  // Sum(33)
    res[34] = fma52hi(res[34], a[5], a[28]);  // Sum(33)
    res[34] = fma52lo(res[34], a[6], a[28]);  // Sum(34)
    res[35] = fma52hi(res[35], a[6], a[28]);  // Sum(34)
    res[35] = fma52lo(res[35], a[7], a[28]);  // Sum(35)
    res[36] = fma52hi(res[36], a[7], a[28]);  // Sum(35)
    res[29] = fma52lo(res[29], a[0], a[29]);  // Sum(29)
    res[30] = fma52hi(res[30], a[0], a[29]);  // Sum(29)
    res[30] = fma52lo(res[30], a[1], a[29]);  // Sum(30)
    res[31] = fma52hi(res[31], a[1], a[29]);  // Sum(30)
    res[31] = fma52lo(res[31], a[2], a[29]);  // Sum(31)
    res[32] = fma52hi(res[32], a[2], a[29]);  // Sum(31)
    res[32] = fma52lo(res[32], a[3], a[29]);  // Sum(32)
    res[33] = fma52hi(res[33], a[3], a[29]);  // Sum(32)
    res[33] = fma52lo(res[33], a[4], a[29]);  // Sum(33)
    res[34] = fma52hi(res[34], a[4], a[29]);  // Sum(33)
    res[34] = fma52lo(res[34], a[5], a[29]);  // Sum(34)
    res[35] = fma52hi(res[35], a[5], a[29]);  // Sum(34)
    res[35] = fma52lo(res[35], a[6], a[29]);  // Sum(35)
    res[36] = fma52hi(res[36], a[6], a[29]);  // Sum(35)
    res[30] = fma52lo(res[30], a[0], a[30]);  // Sum(30)
    res[31] = fma52hi(res[31], a[0], a[30]);  // Sum(30)
    res[31] = fma52lo(res[31], a[1], a[30]);  // Sum(31)
    res[32] = fma52hi(res[32], a[1], a[30]);  // Sum(31)
    res[32] = fma52lo(res[32], a[2], a[30]);  // Sum(32)
    res[33] = fma52hi(res[33], a[2], a[30]);  // Sum(32)
    res[33] = fma52lo(res[33], a[3], a[30]);  // Sum(33)
    res[34] = fma52hi(res[34], a[3], a[30]);  // Sum(33)
    res[34] = fma52lo(res[34], a[4], a[30]);  // Sum(34)
    res[35] = fma52hi(res[35], a[4], a[30]);  // Sum(34)
    res[35] = fma52lo(res[35], a[5], a[30]);  // Sum(35)
    res[36] = fma52hi(res[36], a[5], a[30]);  // Sum(35)
    res[31] = fma52lo(res[31], a[0], a[31]);  // Sum(31)
    res[32] = fma52hi(res[32], a[0], a[31]);  // Sum(31)
    res[32] = fma52lo(res[32], a[1], a[31]);  // Sum(32)
    res[33] = fma52hi(res[33], a[1], a[31]);  // Sum(32)
    res[33] = fma52lo(res[33], a[2], a[31]);  // Sum(33)
    res[34] = fma52hi(res[34], a[2], a[31]);  // Sum(33)
    res[34] = fma52lo(res[34], a[3], a[31]);  // Sum(34)
    res[35] = fma52hi(res[35], a[3], a[31]);  // Sum(34)
    res[35] = fma52lo(res[35], a[4], a[31]);  // Sum(35)
    res[36] = fma52hi(res[36], a[4], a[31]);  // Sum(35)
    res[32] = fma52lo(res[32], a[0], a[32]);  // Sum(32)
    res[33] = fma52hi(res[33], a[0], a[32]);  // Sum(32)
    res[33] = fma52lo(res[33], a[1], a[32]);  // Sum(33)
    res[34] = fma52hi(res[34], a[1], a[32]);  // Sum(33)
    res[34] = fma52lo(res[34], a[2], a[32]);  // Sum(34)
    res[35] = fma52hi(res[35], a[2], a[32]);  // Sum(34)
    res[35] = fma52lo(res[35], a[3], a[32]);  // Sum(35)
    res[36] = fma52hi(res[36], a[3], a[32]);  // Sum(35)
    res[33] = fma52lo(res[33], a[0], a[33]);  // Sum(33)
    res[34] = fma52hi(res[34], a[0], a[33]);  // Sum(33)
    res[34] = fma52lo(res[34], a[1], a[33]);  // Sum(34)
    res[35] = fma52hi(res[35], a[1], a[33]);  // Sum(34)
    res[35] = fma52lo(res[35], a[2], a[33]);  // Sum(35)
    res[36] = fma52hi(res[36], a[2], a[33]);  // Sum(35)
    res[34] = fma52lo(res[34], a[0], a[34]);  // Sum(34)
    res[35] = fma52hi(res[35], a[0], a[34]);  // Sum(34)
    res[35] = fma52lo(res[35], a[1], a[34]);  // Sum(35)
    res[36] = fma52hi(res[36], a[1], a[34]);  // Sum(35)
    res[35] = fma52lo(res[35], a[0], a[35]);  // Sum(35)
    res[36] = fma52hi(res[36], a[0], a[35]);  // Sum(35)
    res[24] = add64(res[24], res[24]);        // Double(24)
    res[25] = add64(res[25], res[25]);        // Double(25)
    res[26] = add64(res[26], res[26]);        // Double(26)
    res[27] = add64(res[27], res[27]);        // Double(27)
    res[28] = add64(res[28], res[28]);        // Double(28)
    res[29] = add64(res[29], res[29]);        // Double(29)
    res[30] = add64(res[30], res[30]);        // Double(30)
    res[31] = add64(res[31], res[31]);        // Double(31)
    res[32] = add64(res[32], res[32]);        // Double(32)
    res[33] = add64(res[33], res[33]);        // Double(33)
    res[34] = add64(res[34], res[34]);        // Double(34)
    res[35] = add64(res[35], res[35]);        // Double(35)
    res[24] = fma52lo(res[24], a[12], a[12]); // Add sqr(24)
    res[25] = fma52hi(res[25], a[12], a[12]); // Add sqr(24)
    res[26] = fma52lo(res[26], a[13], a[13]); // Add sqr(26)
    res[27] = fma52hi(res[27], a[13], a[13]); // Add sqr(26)
    res[28] = fma52lo(res[28], a[14], a[14]); // Add sqr(28)
    res[29] = fma52hi(res[29], a[14], a[14]); // Add sqr(28)
    res[30] = fma52lo(res[30], a[15], a[15]); // Add sqr(30)
    res[31] = fma52hi(res[31], a[15], a[15]); // Add sqr(30)
    res[32] = fma52lo(res[32], a[16], a[16]); // Add sqr(32)
    res[33] = fma52hi(res[33], a[16], a[16]); // Add sqr(32)
    res[34] = fma52lo(res[34], a[17], a[17]); // Add sqr(34)
    res[35] = fma52hi(res[35], a[17], a[17]); // Add sqr(34)
    res[36] = fma52lo(res[36], a[17], a[19]); // Sum(36)
    res[37] = fma52hi(res[37], a[17], a[19]); // Sum(36)
    res[37] = fma52lo(res[37], a[18], a[19]); // Sum(37)
    res[38] = fma52hi(res[38], a[18], a[19]); // Sum(37)
    res[36] = fma52lo(res[36], a[16], a[20]); // Sum(36)
    res[37] = fma52hi(res[37], a[16], a[20]); // Sum(36)
    res[37] = fma52lo(res[37], a[17], a[20]); // Sum(37)
    res[38] = fma52hi(res[38], a[17], a[20]); // Sum(37)
    res[38] = fma52lo(res[38], a[18], a[20]); // Sum(38)
    res[39] = fma52hi(res[39], a[18], a[20]); // Sum(38)
    res[39] = fma52lo(res[39], a[19], a[20]); // Sum(39)
    res[40] = fma52hi(res[40], a[19], a[20]); // Sum(39)
    res[36] = fma52lo(res[36], a[15], a[21]); // Sum(36)
    res[37] = fma52hi(res[37], a[15], a[21]); // Sum(36)
    res[37] = fma52lo(res[37], a[16], a[21]); // Sum(37)
    res[38] = fma52hi(res[38], a[16], a[21]); // Sum(37)
    res[38] = fma52lo(res[38], a[17], a[21]); // Sum(38)
    res[39] = fma52hi(res[39], a[17], a[21]); // Sum(38)
    res[39] = fma52lo(res[39], a[18], a[21]); // Sum(39)
    res[40] = fma52hi(res[40], a[18], a[21]); // Sum(39)
    res[40] = fma52lo(res[40], a[19], a[21]); // Sum(40)
    res[41] = fma52hi(res[41], a[19], a[21]); // Sum(40)
    res[41] = fma52lo(res[41], a[20], a[21]); // Sum(41)
    res[42] = fma52hi(res[42], a[20], a[21]); // Sum(41)
    res[36] = fma52lo(res[36], a[14], a[22]); // Sum(36)
    res[37] = fma52hi(res[37], a[14], a[22]); // Sum(36)
    res[37] = fma52lo(res[37], a[15], a[22]); // Sum(37)
    res[38] = fma52hi(res[38], a[15], a[22]); // Sum(37)
    res[38] = fma52lo(res[38], a[16], a[22]); // Sum(38)
    res[39] = fma52hi(res[39], a[16], a[22]); // Sum(38)
    res[39] = fma52lo(res[39], a[17], a[22]); // Sum(39)
    res[40] = fma52hi(res[40], a[17], a[22]); // Sum(39)
    res[40] = fma52lo(res[40], a[18], a[22]); // Sum(40)
    res[41] = fma52hi(res[41], a[18], a[22]); // Sum(40)
    res[41] = fma52lo(res[41], a[19], a[22]); // Sum(41)
    res[42] = fma52hi(res[42], a[19], a[22]); // Sum(41)
    res[42] = fma52lo(res[42], a[20], a[22]); // Sum(42)
    res[43] = fma52hi(res[43], a[20], a[22]); // Sum(42)
    res[43] = fma52lo(res[43], a[21], a[22]); // Sum(43)
    res[44] = fma52hi(res[44], a[21], a[22]); // Sum(43)
    res[36] = fma52lo(res[36], a[13], a[23]); // Sum(36)
    res[37] = fma52hi(res[37], a[13], a[23]); // Sum(36)
    res[37] = fma52lo(res[37], a[14], a[23]); // Sum(37)
    res[38] = fma52hi(res[38], a[14], a[23]); // Sum(37)
    res[38] = fma52lo(res[38], a[15], a[23]); // Sum(38)
    res[39] = fma52hi(res[39], a[15], a[23]); // Sum(38)
    res[39] = fma52lo(res[39], a[16], a[23]); // Sum(39)
    res[40] = fma52hi(res[40], a[16], a[23]); // Sum(39)
    res[40] = fma52lo(res[40], a[17], a[23]); // Sum(40)
    res[41] = fma52hi(res[41], a[17], a[23]); // Sum(40)
    res[41] = fma52lo(res[41], a[18], a[23]); // Sum(41)
    res[42] = fma52hi(res[42], a[18], a[23]); // Sum(41)
    res[42] = fma52lo(res[42], a[19], a[23]); // Sum(42)
    res[43] = fma52hi(res[43], a[19], a[23]); // Sum(42)
    res[43] = fma52lo(res[43], a[20], a[23]); // Sum(43)
    res[44] = fma52hi(res[44], a[20], a[23]); // Sum(43)
    res[44] = fma52lo(res[44], a[21], a[23]); // Sum(44)
    res[45] = fma52hi(res[45], a[21], a[23]); // Sum(44)
    res[45] = fma52lo(res[45], a[22], a[23]); // Sum(45)
    res[46] = fma52hi(res[46], a[22], a[23]); // Sum(45)
    res[36] = fma52lo(res[36], a[12], a[24]); // Sum(36)
    res[37] = fma52hi(res[37], a[12], a[24]); // Sum(36)
    res[37] = fma52lo(res[37], a[13], a[24]); // Sum(37)
    res[38] = fma52hi(res[38], a[13], a[24]); // Sum(37)
    res[38] = fma52lo(res[38], a[14], a[24]); // Sum(38)
    res[39] = fma52hi(res[39], a[14], a[24]); // Sum(38)
    res[39] = fma52lo(res[39], a[15], a[24]); // Sum(39)
    res[40] = fma52hi(res[40], a[15], a[24]); // Sum(39)
    res[40] = fma52lo(res[40], a[16], a[24]); // Sum(40)
    res[41] = fma52hi(res[41], a[16], a[24]); // Sum(40)
    res[41] = fma52lo(res[41], a[17], a[24]); // Sum(41)
    res[42] = fma52hi(res[42], a[17], a[24]); // Sum(41)
    res[42] = fma52lo(res[42], a[18], a[24]); // Sum(42)
    res[43] = fma52hi(res[43], a[18], a[24]); // Sum(42)
    res[43] = fma52lo(res[43], a[19], a[24]); // Sum(43)
    res[44] = fma52hi(res[44], a[19], a[24]); // Sum(43)
    res[44] = fma52lo(res[44], a[20], a[24]); // Sum(44)
    res[45] = fma52hi(res[45], a[20], a[24]); // Sum(44)
    res[45] = fma52lo(res[45], a[21], a[24]); // Sum(45)
    res[46] = fma52hi(res[46], a[21], a[24]); // Sum(45)
    res[46] = fma52lo(res[46], a[22], a[24]); // Sum(46)
    res[47] = fma52hi(res[47], a[22], a[24]); // Sum(46)
    res[47] = fma52lo(res[47], a[23], a[24]); // Sum(47)
    res[48] = fma52hi(res[48], a[23], a[24]); // Sum(47)
    res[36] = fma52lo(res[36], a[11], a[25]); // Sum(36)
    res[37] = fma52hi(res[37], a[11], a[25]); // Sum(36)
    res[37] = fma52lo(res[37], a[12], a[25]); // Sum(37)
    res[38] = fma52hi(res[38], a[12], a[25]); // Sum(37)
    res[38] = fma52lo(res[38], a[13], a[25]); // Sum(38)
    res[39] = fma52hi(res[39], a[13], a[25]); // Sum(38)
    res[39] = fma52lo(res[39], a[14], a[25]); // Sum(39)
    res[40] = fma52hi(res[40], a[14], a[25]); // Sum(39)
    res[40] = fma52lo(res[40], a[15], a[25]); // Sum(40)
    res[41] = fma52hi(res[41], a[15], a[25]); // Sum(40)
    res[41] = fma52lo(res[41], a[16], a[25]); // Sum(41)
    res[42] = fma52hi(res[42], a[16], a[25]); // Sum(41)
    res[42] = fma52lo(res[42], a[17], a[25]); // Sum(42)
    res[43] = fma52hi(res[43], a[17], a[25]); // Sum(42)
    res[43] = fma52lo(res[43], a[18], a[25]); // Sum(43)
    res[44] = fma52hi(res[44], a[18], a[25]); // Sum(43)
    res[44] = fma52lo(res[44], a[19], a[25]); // Sum(44)
    res[45] = fma52hi(res[45], a[19], a[25]); // Sum(44)
    res[45] = fma52lo(res[45], a[20], a[25]); // Sum(45)
    res[46] = fma52hi(res[46], a[20], a[25]); // Sum(45)
    res[46] = fma52lo(res[46], a[21], a[25]); // Sum(46)
    res[47] = fma52hi(res[47], a[21], a[25]); // Sum(46)
    res[47] = fma52lo(res[47], a[22], a[25]); // Sum(47)
    res[48] = fma52hi(res[48], a[22], a[25]); // Sum(47)
    res[36] = fma52lo(res[36], a[10], a[26]); // Sum(36)
    res[37] = fma52hi(res[37], a[10], a[26]); // Sum(36)
    res[37] = fma52lo(res[37], a[11], a[26]); // Sum(37)
    res[38] = fma52hi(res[38], a[11], a[26]); // Sum(37)
    res[38] = fma52lo(res[38], a[12], a[26]); // Sum(38)
    res[39] = fma52hi(res[39], a[12], a[26]); // Sum(38)
    res[39] = fma52lo(res[39], a[13], a[26]); // Sum(39)
    res[40] = fma52hi(res[40], a[13], a[26]); // Sum(39)
    res[40] = fma52lo(res[40], a[14], a[26]); // Sum(40)
    res[41] = fma52hi(res[41], a[14], a[26]); // Sum(40)
    res[41] = fma52lo(res[41], a[15], a[26]); // Sum(41)
    res[42] = fma52hi(res[42], a[15], a[26]); // Sum(41)
    res[42] = fma52lo(res[42], a[16], a[26]); // Sum(42)
    res[43] = fma52hi(res[43], a[16], a[26]); // Sum(42)
    res[43] = fma52lo(res[43], a[17], a[26]); // Sum(43)
    res[44] = fma52hi(res[44], a[17], a[26]); // Sum(43)
    res[44] = fma52lo(res[44], a[18], a[26]); // Sum(44)
    res[45] = fma52hi(res[45], a[18], a[26]); // Sum(44)
    res[45] = fma52lo(res[45], a[19], a[26]); // Sum(45)
    res[46] = fma52hi(res[46], a[19], a[26]); // Sum(45)
    res[46] = fma52lo(res[46], a[20], a[26]); // Sum(46)
    res[47] = fma52hi(res[47], a[20], a[26]); // Sum(46)
    res[47] = fma52lo(res[47], a[21], a[26]); // Sum(47)
    res[48] = fma52hi(res[48], a[21], a[26]); // Sum(47)
    res[36] = fma52lo(res[36], a[9], a[27]);  // Sum(36)
    res[37] = fma52hi(res[37], a[9], a[27]);  // Sum(36)
    res[37] = fma52lo(res[37], a[10], a[27]); // Sum(37)
    res[38] = fma52hi(res[38], a[10], a[27]); // Sum(37)
    res[38] = fma52lo(res[38], a[11], a[27]); // Sum(38)
    res[39] = fma52hi(res[39], a[11], a[27]); // Sum(38)
    res[39] = fma52lo(res[39], a[12], a[27]); // Sum(39)
    res[40] = fma52hi(res[40], a[12], a[27]); // Sum(39)
    res[40] = fma52lo(res[40], a[13], a[27]); // Sum(40)
    res[41] = fma52hi(res[41], a[13], a[27]); // Sum(40)
    res[41] = fma52lo(res[41], a[14], a[27]); // Sum(41)
    res[42] = fma52hi(res[42], a[14], a[27]); // Sum(41)
    res[42] = fma52lo(res[42], a[15], a[27]); // Sum(42)
    res[43] = fma52hi(res[43], a[15], a[27]); // Sum(42)
    res[43] = fma52lo(res[43], a[16], a[27]); // Sum(43)
    res[44] = fma52hi(res[44], a[16], a[27]); // Sum(43)
    res[44] = fma52lo(res[44], a[17], a[27]); // Sum(44)
    res[45] = fma52hi(res[45], a[17], a[27]); // Sum(44)
    res[45] = fma52lo(res[45], a[18], a[27]); // Sum(45)
    res[46] = fma52hi(res[46], a[18], a[27]); // Sum(45)
    res[46] = fma52lo(res[46], a[19], a[27]); // Sum(46)
    res[47] = fma52hi(res[47], a[19], a[27]); // Sum(46)
    res[47] = fma52lo(res[47], a[20], a[27]); // Sum(47)
    res[48] = fma52hi(res[48], a[20], a[27]); // Sum(47)
    res[36] = fma52lo(res[36], a[8], a[28]);  // Sum(36)
    res[37] = fma52hi(res[37], a[8], a[28]);  // Sum(36)
    res[37] = fma52lo(res[37], a[9], a[28]);  // Sum(37)
    res[38] = fma52hi(res[38], a[9], a[28]);  // Sum(37)
    res[38] = fma52lo(res[38], a[10], a[28]); // Sum(38)
    res[39] = fma52hi(res[39], a[10], a[28]); // Sum(38)
    res[39] = fma52lo(res[39], a[11], a[28]); // Sum(39)
    res[40] = fma52hi(res[40], a[11], a[28]); // Sum(39)
    res[40] = fma52lo(res[40], a[12], a[28]); // Sum(40)
    res[41] = fma52hi(res[41], a[12], a[28]); // Sum(40)
    res[41] = fma52lo(res[41], a[13], a[28]); // Sum(41)
    res[42] = fma52hi(res[42], a[13], a[28]); // Sum(41)
    res[42] = fma52lo(res[42], a[14], a[28]); // Sum(42)
    res[43] = fma52hi(res[43], a[14], a[28]); // Sum(42)
    res[43] = fma52lo(res[43], a[15], a[28]); // Sum(43)
    res[44] = fma52hi(res[44], a[15], a[28]); // Sum(43)
    res[44] = fma52lo(res[44], a[16], a[28]); // Sum(44)
    res[45] = fma52hi(res[45], a[16], a[28]); // Sum(44)
    res[45] = fma52lo(res[45], a[17], a[28]); // Sum(45)
    res[46] = fma52hi(res[46], a[17], a[28]); // Sum(45)
    res[46] = fma52lo(res[46], a[18], a[28]); // Sum(46)
    res[47] = fma52hi(res[47], a[18], a[28]); // Sum(46)
    res[47] = fma52lo(res[47], a[19], a[28]); // Sum(47)
    res[48] = fma52hi(res[48], a[19], a[28]); // Sum(47)
    res[36] = fma52lo(res[36], a[7], a[29]);  // Sum(36)
    res[37] = fma52hi(res[37], a[7], a[29]);  // Sum(36)
    res[37] = fma52lo(res[37], a[8], a[29]);  // Sum(37)
    res[38] = fma52hi(res[38], a[8], a[29]);  // Sum(37)
    res[38] = fma52lo(res[38], a[9], a[29]);  // Sum(38)
    res[39] = fma52hi(res[39], a[9], a[29]);  // Sum(38)
    res[39] = fma52lo(res[39], a[10], a[29]); // Sum(39)
    res[40] = fma52hi(res[40], a[10], a[29]); // Sum(39)
    res[40] = fma52lo(res[40], a[11], a[29]); // Sum(40)
    res[41] = fma52hi(res[41], a[11], a[29]); // Sum(40)
    res[41] = fma52lo(res[41], a[12], a[29]); // Sum(41)
    res[42] = fma52hi(res[42], a[12], a[29]); // Sum(41)
    res[42] = fma52lo(res[42], a[13], a[29]); // Sum(42)
    res[43] = fma52hi(res[43], a[13], a[29]); // Sum(42)
    res[43] = fma52lo(res[43], a[14], a[29]); // Sum(43)
    res[44] = fma52hi(res[44], a[14], a[29]); // Sum(43)
    res[44] = fma52lo(res[44], a[15], a[29]); // Sum(44)
    res[45] = fma52hi(res[45], a[15], a[29]); // Sum(44)
    res[45] = fma52lo(res[45], a[16], a[29]); // Sum(45)
    res[46] = fma52hi(res[46], a[16], a[29]); // Sum(45)
    res[46] = fma52lo(res[46], a[17], a[29]); // Sum(46)
    res[47] = fma52hi(res[47], a[17], a[29]); // Sum(46)
    res[47] = fma52lo(res[47], a[18], a[29]); // Sum(47)
    res[48] = fma52hi(res[48], a[18], a[29]); // Sum(47)
    res[36] = fma52lo(res[36], a[6], a[30]);  // Sum(36)
    res[37] = fma52hi(res[37], a[6], a[30]);  // Sum(36)
    res[37] = fma52lo(res[37], a[7], a[30]);  // Sum(37)
    res[38] = fma52hi(res[38], a[7], a[30]);  // Sum(37)
    res[38] = fma52lo(res[38], a[8], a[30]);  // Sum(38)
    res[39] = fma52hi(res[39], a[8], a[30]);  // Sum(38)
    res[39] = fma52lo(res[39], a[9], a[30]);  // Sum(39)
    res[40] = fma52hi(res[40], a[9], a[30]);  // Sum(39)
    res[40] = fma52lo(res[40], a[10], a[30]); // Sum(40)
    res[41] = fma52hi(res[41], a[10], a[30]); // Sum(40)
    res[41] = fma52lo(res[41], a[11], a[30]); // Sum(41)
    res[42] = fma52hi(res[42], a[11], a[30]); // Sum(41)
    res[42] = fma52lo(res[42], a[12], a[30]); // Sum(42)
    res[43] = fma52hi(res[43], a[12], a[30]); // Sum(42)
    res[43] = fma52lo(res[43], a[13], a[30]); // Sum(43)
    res[44] = fma52hi(res[44], a[13], a[30]); // Sum(43)
    res[44] = fma52lo(res[44], a[14], a[30]); // Sum(44)
    res[45] = fma52hi(res[45], a[14], a[30]); // Sum(44)
    res[45] = fma52lo(res[45], a[15], a[30]); // Sum(45)
    res[46] = fma52hi(res[46], a[15], a[30]); // Sum(45)
    res[46] = fma52lo(res[46], a[16], a[30]); // Sum(46)
    res[47] = fma52hi(res[47], a[16], a[30]); // Sum(46)
    res[47] = fma52lo(res[47], a[17], a[30]); // Sum(47)
    res[48] = fma52hi(res[48], a[17], a[30]); // Sum(47)
    res[36] = fma52lo(res[36], a[5], a[31]);  // Sum(36)
    res[37] = fma52hi(res[37], a[5], a[31]);  // Sum(36)
    res[37] = fma52lo(res[37], a[6], a[31]);  // Sum(37)
    res[38] = fma52hi(res[38], a[6], a[31]);  // Sum(37)
    res[38] = fma52lo(res[38], a[7], a[31]);  // Sum(38)
    res[39] = fma52hi(res[39], a[7], a[31]);  // Sum(38)
    res[39] = fma52lo(res[39], a[8], a[31]);  // Sum(39)
    res[40] = fma52hi(res[40], a[8], a[31]);  // Sum(39)
    res[40] = fma52lo(res[40], a[9], a[31]);  // Sum(40)
    res[41] = fma52hi(res[41], a[9], a[31]);  // Sum(40)
    res[41] = fma52lo(res[41], a[10], a[31]); // Sum(41)
    res[42] = fma52hi(res[42], a[10], a[31]); // Sum(41)
    res[42] = fma52lo(res[42], a[11], a[31]); // Sum(42)
    res[43] = fma52hi(res[43], a[11], a[31]); // Sum(42)
    res[43] = fma52lo(res[43], a[12], a[31]); // Sum(43)
    res[44] = fma52hi(res[44], a[12], a[31]); // Sum(43)
    res[44] = fma52lo(res[44], a[13], a[31]); // Sum(44)
    res[45] = fma52hi(res[45], a[13], a[31]); // Sum(44)
    res[45] = fma52lo(res[45], a[14], a[31]); // Sum(45)
    res[46] = fma52hi(res[46], a[14], a[31]); // Sum(45)
    res[46] = fma52lo(res[46], a[15], a[31]); // Sum(46)
    res[47] = fma52hi(res[47], a[15], a[31]); // Sum(46)
    res[47] = fma52lo(res[47], a[16], a[31]); // Sum(47)
    res[48] = fma52hi(res[48], a[16], a[31]); // Sum(47)
    res[36] = fma52lo(res[36], a[4], a[32]);  // Sum(36)
    res[37] = fma52hi(res[37], a[4], a[32]);  // Sum(36)
    res[37] = fma52lo(res[37], a[5], a[32]);  // Sum(37)
    res[38] = fma52hi(res[38], a[5], a[32]);  // Sum(37)
    res[38] = fma52lo(res[38], a[6], a[32]);  // Sum(38)
    res[39] = fma52hi(res[39], a[6], a[32]);  // Sum(38)
    res[39] = fma52lo(res[39], a[7], a[32]);  // Sum(39)
    res[40] = fma52hi(res[40], a[7], a[32]);  // Sum(39)
    res[40] = fma52lo(res[40], a[8], a[32]);  // Sum(40)
    res[41] = fma52hi(res[41], a[8], a[32]);  // Sum(40)
    res[41] = fma52lo(res[41], a[9], a[32]);  // Sum(41)
    res[42] = fma52hi(res[42], a[9], a[32]);  // Sum(41)
    res[42] = fma52lo(res[42], a[10], a[32]); // Sum(42)
    res[43] = fma52hi(res[43], a[10], a[32]); // Sum(42)
    res[43] = fma52lo(res[43], a[11], a[32]); // Sum(43)
    res[44] = fma52hi(res[44], a[11], a[32]); // Sum(43)
    res[44] = fma52lo(res[44], a[12], a[32]); // Sum(44)
    res[45] = fma52hi(res[45], a[12], a[32]); // Sum(44)
    res[45] = fma52lo(res[45], a[13], a[32]); // Sum(45)
    res[46] = fma52hi(res[46], a[13], a[32]); // Sum(45)
    res[46] = fma52lo(res[46], a[14], a[32]); // Sum(46)
    res[47] = fma52hi(res[47], a[14], a[32]); // Sum(46)
    res[47] = fma52lo(res[47], a[15], a[32]); // Sum(47)
    res[48] = fma52hi(res[48], a[15], a[32]); // Sum(47)
    res[36] = fma52lo(res[36], a[3], a[33]);  // Sum(36)
    res[37] = fma52hi(res[37], a[3], a[33]);  // Sum(36)
    res[37] = fma52lo(res[37], a[4], a[33]);  // Sum(37)
    res[38] = fma52hi(res[38], a[4], a[33]);  // Sum(37)
    res[38] = fma52lo(res[38], a[5], a[33]);  // Sum(38)
    res[39] = fma52hi(res[39], a[5], a[33]);  // Sum(38)
    res[39] = fma52lo(res[39], a[6], a[33]);  // Sum(39)
    res[40] = fma52hi(res[40], a[6], a[33]);  // Sum(39)
    res[40] = fma52lo(res[40], a[7], a[33]);  // Sum(40)
    res[41] = fma52hi(res[41], a[7], a[33]);  // Sum(40)
    res[41] = fma52lo(res[41], a[8], a[33]);  // Sum(41)
    res[42] = fma52hi(res[42], a[8], a[33]);  // Sum(41)
    res[42] = fma52lo(res[42], a[9], a[33]);  // Sum(42)
    res[43] = fma52hi(res[43], a[9], a[33]);  // Sum(42)
    res[43] = fma52lo(res[43], a[10], a[33]); // Sum(43)
    res[44] = fma52hi(res[44], a[10], a[33]); // Sum(43)
    res[44] = fma52lo(res[44], a[11], a[33]); // Sum(44)
    res[45] = fma52hi(res[45], a[11], a[33]); // Sum(44)
    res[45] = fma52lo(res[45], a[12], a[33]); // Sum(45)
    res[46] = fma52hi(res[46], a[12], a[33]); // Sum(45)
    res[46] = fma52lo(res[46], a[13], a[33]); // Sum(46)
    res[47] = fma52hi(res[47], a[13], a[33]); // Sum(46)
    res[47] = fma52lo(res[47], a[14], a[33]); // Sum(47)
    res[48] = fma52hi(res[48], a[14], a[33]); // Sum(47)
    res[36] = fma52lo(res[36], a[2], a[34]);  // Sum(36)
    res[37] = fma52hi(res[37], a[2], a[34]);  // Sum(36)
    res[37] = fma52lo(res[37], a[3], a[34]);  // Sum(37)
    res[38] = fma52hi(res[38], a[3], a[34]);  // Sum(37)
    res[38] = fma52lo(res[38], a[4], a[34]);  // Sum(38)
    res[39] = fma52hi(res[39], a[4], a[34]);  // Sum(38)
    res[39] = fma52lo(res[39], a[5], a[34]);  // Sum(39)
    res[40] = fma52hi(res[40], a[5], a[34]);  // Sum(39)
    res[40] = fma52lo(res[40], a[6], a[34]);  // Sum(40)
    res[41] = fma52hi(res[41], a[6], a[34]);  // Sum(40)
    res[41] = fma52lo(res[41], a[7], a[34]);  // Sum(41)
    res[42] = fma52hi(res[42], a[7], a[34]);  // Sum(41)
    res[42] = fma52lo(res[42], a[8], a[34]);  // Sum(42)
    res[43] = fma52hi(res[43], a[8], a[34]);  // Sum(42)
    res[43] = fma52lo(res[43], a[9], a[34]);  // Sum(43)
    res[44] = fma52hi(res[44], a[9], a[34]);  // Sum(43)
    res[44] = fma52lo(res[44], a[10], a[34]); // Sum(44)
    res[45] = fma52hi(res[45], a[10], a[34]); // Sum(44)
    res[45] = fma52lo(res[45], a[11], a[34]); // Sum(45)
    res[46] = fma52hi(res[46], a[11], a[34]); // Sum(45)
    res[46] = fma52lo(res[46], a[12], a[34]); // Sum(46)
    res[47] = fma52hi(res[47], a[12], a[34]); // Sum(46)
    res[47] = fma52lo(res[47], a[13], a[34]); // Sum(47)
    res[48] = fma52hi(res[48], a[13], a[34]); // Sum(47)
    res[36] = fma52lo(res[36], a[1], a[35]);  // Sum(36)
    res[37] = fma52hi(res[37], a[1], a[35]);  // Sum(36)
    res[37] = fma52lo(res[37], a[2], a[35]);  // Sum(37)
    res[38] = fma52hi(res[38], a[2], a[35]);  // Sum(37)
    res[38] = fma52lo(res[38], a[3], a[35]);  // Sum(38)
    res[39] = fma52hi(res[39], a[3], a[35]);  // Sum(38)
    res[39] = fma52lo(res[39], a[4], a[35]);  // Sum(39)
    res[40] = fma52hi(res[40], a[4], a[35]);  // Sum(39)
    res[40] = fma52lo(res[40], a[5], a[35]);  // Sum(40)
    res[41] = fma52hi(res[41], a[5], a[35]);  // Sum(40)
    res[41] = fma52lo(res[41], a[6], a[35]);  // Sum(41)
    res[42] = fma52hi(res[42], a[6], a[35]);  // Sum(41)
    res[42] = fma52lo(res[42], a[7], a[35]);  // Sum(42)
    res[43] = fma52hi(res[43], a[7], a[35]);  // Sum(42)
    res[43] = fma52lo(res[43], a[8], a[35]);  // Sum(43)
    res[44] = fma52hi(res[44], a[8], a[35]);  // Sum(43)
    res[44] = fma52lo(res[44], a[9], a[35]);  // Sum(44)
    res[45] = fma52hi(res[45], a[9], a[35]);  // Sum(44)
    res[45] = fma52lo(res[45], a[10], a[35]); // Sum(45)
    res[46] = fma52hi(res[46], a[10], a[35]); // Sum(45)
    res[46] = fma52lo(res[46], a[11], a[35]); // Sum(46)
    res[47] = fma52hi(res[47], a[11], a[35]); // Sum(46)
    res[47] = fma52lo(res[47], a[12], a[35]); // Sum(47)
    res[48] = fma52hi(res[48], a[12], a[35]); // Sum(47)
    res[36] = fma52lo(res[36], a[0], a[36]);  // Sum(36)
    res[37] = fma52hi(res[37], a[0], a[36]);  // Sum(36)
    res[37] = fma52lo(res[37], a[1], a[36]);  // Sum(37)
    res[38] = fma52hi(res[38], a[1], a[36]);  // Sum(37)
    res[38] = fma52lo(res[38], a[2], a[36]);  // Sum(38)
    res[39] = fma52hi(res[39], a[2], a[36]);  // Sum(38)
    res[39] = fma52lo(res[39], a[3], a[36]);  // Sum(39)
    res[40] = fma52hi(res[40], a[3], a[36]);  // Sum(39)
    res[40] = fma52lo(res[40], a[4], a[36]);  // Sum(40)
    res[41] = fma52hi(res[41], a[4], a[36]);  // Sum(40)
    res[41] = fma52lo(res[41], a[5], a[36]);  // Sum(41)
    res[42] = fma52hi(res[42], a[5], a[36]);  // Sum(41)
    res[42] = fma52lo(res[42], a[6], a[36]);  // Sum(42)
    res[43] = fma52hi(res[43], a[6], a[36]);  // Sum(42)
    res[43] = fma52lo(res[43], a[7], a[36]);  // Sum(43)
    res[44] = fma52hi(res[44], a[7], a[36]);  // Sum(43)
    res[44] = fma52lo(res[44], a[8], a[36]);  // Sum(44)
    res[45] = fma52hi(res[45], a[8], a[36]);  // Sum(44)
    res[45] = fma52lo(res[45], a[9], a[36]);  // Sum(45)
    res[46] = fma52hi(res[46], a[9], a[36]);  // Sum(45)
    res[46] = fma52lo(res[46], a[10], a[36]); // Sum(46)
    res[47] = fma52hi(res[47], a[10], a[36]); // Sum(46)
    res[47] = fma52lo(res[47], a[11], a[36]); // Sum(47)
    res[48] = fma52hi(res[48], a[11], a[36]); // Sum(47)
    res[37] = fma52lo(res[37], a[0], a[37]);  // Sum(37)
    res[38] = fma52hi(res[38], a[0], a[37]);  // Sum(37)
    res[38] = fma52lo(res[38], a[1], a[37]);  // Sum(38)
    res[39] = fma52hi(res[39], a[1], a[37]);  // Sum(38)
    res[39] = fma52lo(res[39], a[2], a[37]);  // Sum(39)
    res[40] = fma52hi(res[40], a[2], a[37]);  // Sum(39)
    res[40] = fma52lo(res[40], a[3], a[37]);  // Sum(40)
    res[41] = fma52hi(res[41], a[3], a[37]);  // Sum(40)
    res[41] = fma52lo(res[41], a[4], a[37]);  // Sum(41)
    res[42] = fma52hi(res[42], a[4], a[37]);  // Sum(41)
    res[42] = fma52lo(res[42], a[5], a[37]);  // Sum(42)
    res[43] = fma52hi(res[43], a[5], a[37]);  // Sum(42)
    res[43] = fma52lo(res[43], a[6], a[37]);  // Sum(43)
    res[44] = fma52hi(res[44], a[6], a[37]);  // Sum(43)
    res[44] = fma52lo(res[44], a[7], a[37]);  // Sum(44)
    res[45] = fma52hi(res[45], a[7], a[37]);  // Sum(44)
    res[45] = fma52lo(res[45], a[8], a[37]);  // Sum(45)
    res[46] = fma52hi(res[46], a[8], a[37]);  // Sum(45)
    res[46] = fma52lo(res[46], a[9], a[37]);  // Sum(46)
    res[47] = fma52hi(res[47], a[9], a[37]);  // Sum(46)
    res[47] = fma52lo(res[47], a[10], a[37]); // Sum(47)
    res[48] = fma52hi(res[48], a[10], a[37]); // Sum(47)
    res[38] = fma52lo(res[38], a[0], a[38]);  // Sum(38)
    res[39] = fma52hi(res[39], a[0], a[38]);  // Sum(38)
    res[39] = fma52lo(res[39], a[1], a[38]);  // Sum(39)
    res[40] = fma52hi(res[40], a[1], a[38]);  // Sum(39)
    res[40] = fma52lo(res[40], a[2], a[38]);  // Sum(40)
    res[41] = fma52hi(res[41], a[2], a[38]);  // Sum(40)
    res[41] = fma52lo(res[41], a[3], a[38]);  // Sum(41)
    res[42] = fma52hi(res[42], a[3], a[38]);  // Sum(41)
    res[42] = fma52lo(res[42], a[4], a[38]);  // Sum(42)
    res[43] = fma52hi(res[43], a[4], a[38]);  // Sum(42)
    res[43] = fma52lo(res[43], a[5], a[38]);  // Sum(43)
    res[44] = fma52hi(res[44], a[5], a[38]);  // Sum(43)
    res[44] = fma52lo(res[44], a[6], a[38]);  // Sum(44)
    res[45] = fma52hi(res[45], a[6], a[38]);  // Sum(44)
    res[45] = fma52lo(res[45], a[7], a[38]);  // Sum(45)
    res[46] = fma52hi(res[46], a[7], a[38]);  // Sum(45)
    res[46] = fma52lo(res[46], a[8], a[38]);  // Sum(46)
    res[47] = fma52hi(res[47], a[8], a[38]);  // Sum(46)
    res[47] = fma52lo(res[47], a[9], a[38]);  // Sum(47)
    res[48] = fma52hi(res[48], a[9], a[38]);  // Sum(47)
    res[39] = fma52lo(res[39], a[0], a[39]);  // Sum(39)
    res[40] = fma52hi(res[40], a[0], a[39]);  // Sum(39)
    res[40] = fma52lo(res[40], a[1], a[39]);  // Sum(40)
    res[41] = fma52hi(res[41], a[1], a[39]);  // Sum(40)
    res[41] = fma52lo(res[41], a[2], a[39]);  // Sum(41)
    res[42] = fma52hi(res[42], a[2], a[39]);  // Sum(41)
    res[42] = fma52lo(res[42], a[3], a[39]);  // Sum(42)
    res[43] = fma52hi(res[43], a[3], a[39]);  // Sum(42)
    res[43] = fma52lo(res[43], a[4], a[39]);  // Sum(43)
    res[44] = fma52hi(res[44], a[4], a[39]);  // Sum(43)
    res[44] = fma52lo(res[44], a[5], a[39]);  // Sum(44)
    res[45] = fma52hi(res[45], a[5], a[39]);  // Sum(44)
    res[45] = fma52lo(res[45], a[6], a[39]);  // Sum(45)
    res[46] = fma52hi(res[46], a[6], a[39]);  // Sum(45)
    res[46] = fma52lo(res[46], a[7], a[39]);  // Sum(46)
    res[47] = fma52hi(res[47], a[7], a[39]);  // Sum(46)
    res[47] = fma52lo(res[47], a[8], a[39]);  // Sum(47)
    res[48] = fma52hi(res[48], a[8], a[39]);  // Sum(47)
    res[36] = add64(res[36], res[36]);        // Double(36)
    res[37] = add64(res[37], res[37]);        // Double(37)
    res[38] = add64(res[38], res[38]);        // Double(38)
    res[39] = add64(res[39], res[39]);        // Double(39)
    res[40] = add64(res[40], res[40]);        // Double(40)
    res[41] = add64(res[41], res[41]);        // Double(41)
    res[42] = add64(res[42], res[42]);        // Double(42)
    res[43] = add64(res[43], res[43]);        // Double(43)
    res[44] = add64(res[44], res[44]);        // Double(44)
    res[45] = add64(res[45], res[45]);        // Double(45)
    res[46] = add64(res[46], res[46]);        // Double(46)
    res[47] = add64(res[47], res[47]);        // Double(47)
    res[36] = fma52lo(res[36], a[18], a[18]); // Add sqr(36)
    res[37] = fma52hi(res[37], a[18], a[18]); // Add sqr(36)
    res[38] = fma52lo(res[38], a[19], a[19]); // Add sqr(38)
    res[39] = fma52hi(res[39], a[19], a[19]); // Add sqr(38)
    res[40] = fma52lo(res[40], a[20], a[20]); // Add sqr(40)
    res[41] = fma52hi(res[41], a[20], a[20]); // Add sqr(40)
    res[42] = fma52lo(res[42], a[21], a[21]); // Add sqr(42)
    res[43] = fma52hi(res[43], a[21], a[21]); // Add sqr(42)
    res[44] = fma52lo(res[44], a[22], a[22]); // Add sqr(44)
    res[45] = fma52hi(res[45], a[22], a[22]); // Add sqr(44)
    res[46] = fma52lo(res[46], a[23], a[23]); // Add sqr(46)
    res[47] = fma52hi(res[47], a[23], a[23]); // Add sqr(46)
    res[48] = fma52lo(res[48], a[23], a[25]); // Sum(48)
    res[49] = fma52hi(res[49], a[23], a[25]); // Sum(48)
    res[49] = fma52lo(res[49], a[24], a[25]); // Sum(49)
    res[50] = fma52hi(res[50], a[24], a[25]); // Sum(49)
    res[48] = fma52lo(res[48], a[22], a[26]); // Sum(48)
    res[49] = fma52hi(res[49], a[22], a[26]); // Sum(48)
    res[49] = fma52lo(res[49], a[23], a[26]); // Sum(49)
    res[50] = fma52hi(res[50], a[23], a[26]); // Sum(49)
    res[50] = fma52lo(res[50], a[24], a[26]); // Sum(50)
    res[51] = fma52hi(res[51], a[24], a[26]); // Sum(50)
    res[51] = fma52lo(res[51], a[25], a[26]); // Sum(51)
    res[52] = fma52hi(res[52], a[25], a[26]); // Sum(51)
    res[48] = fma52lo(res[48], a[21], a[27]); // Sum(48)
    res[49] = fma52hi(res[49], a[21], a[27]); // Sum(48)
    res[49] = fma52lo(res[49], a[22], a[27]); // Sum(49)
    res[50] = fma52hi(res[50], a[22], a[27]); // Sum(49)
    res[50] = fma52lo(res[50], a[23], a[27]); // Sum(50)
    res[51] = fma52hi(res[51], a[23], a[27]); // Sum(50)
    res[51] = fma52lo(res[51], a[24], a[27]); // Sum(51)
    res[52] = fma52hi(res[52], a[24], a[27]); // Sum(51)
    res[52] = fma52lo(res[52], a[25], a[27]); // Sum(52)
    res[53] = fma52hi(res[53], a[25], a[27]); // Sum(52)
    res[53] = fma52lo(res[53], a[26], a[27]); // Sum(53)
    res[54] = fma52hi(res[54], a[26], a[27]); // Sum(53)
    res[48] = fma52lo(res[48], a[20], a[28]); // Sum(48)
    res[49] = fma52hi(res[49], a[20], a[28]); // Sum(48)
    res[49] = fma52lo(res[49], a[21], a[28]); // Sum(49)
    res[50] = fma52hi(res[50], a[21], a[28]); // Sum(49)
    res[50] = fma52lo(res[50], a[22], a[28]); // Sum(50)
    res[51] = fma52hi(res[51], a[22], a[28]); // Sum(50)
    res[51] = fma52lo(res[51], a[23], a[28]); // Sum(51)
    res[52] = fma52hi(res[52], a[23], a[28]); // Sum(51)
    res[52] = fma52lo(res[52], a[24], a[28]); // Sum(52)
    res[53] = fma52hi(res[53], a[24], a[28]); // Sum(52)
    res[53] = fma52lo(res[53], a[25], a[28]); // Sum(53)
    res[54] = fma52hi(res[54], a[25], a[28]); // Sum(53)
    res[54] = fma52lo(res[54], a[26], a[28]); // Sum(54)
    res[55] = fma52hi(res[55], a[26], a[28]); // Sum(54)
    res[55] = fma52lo(res[55], a[27], a[28]); // Sum(55)
    res[56] = fma52hi(res[56], a[27], a[28]); // Sum(55)
    res[48] = fma52lo(res[48], a[19], a[29]); // Sum(48)
    res[49] = fma52hi(res[49], a[19], a[29]); // Sum(48)
    res[49] = fma52lo(res[49], a[20], a[29]); // Sum(49)
    res[50] = fma52hi(res[50], a[20], a[29]); // Sum(49)
    res[50] = fma52lo(res[50], a[21], a[29]); // Sum(50)
    res[51] = fma52hi(res[51], a[21], a[29]); // Sum(50)
    res[51] = fma52lo(res[51], a[22], a[29]); // Sum(51)
    res[52] = fma52hi(res[52], a[22], a[29]); // Sum(51)
    res[52] = fma52lo(res[52], a[23], a[29]); // Sum(52)
    res[53] = fma52hi(res[53], a[23], a[29]); // Sum(52)
    res[53] = fma52lo(res[53], a[24], a[29]); // Sum(53)
    res[54] = fma52hi(res[54], a[24], a[29]); // Sum(53)
    res[54] = fma52lo(res[54], a[25], a[29]); // Sum(54)
    res[55] = fma52hi(res[55], a[25], a[29]); // Sum(54)
    res[55] = fma52lo(res[55], a[26], a[29]); // Sum(55)
    res[56] = fma52hi(res[56], a[26], a[29]); // Sum(55)
    res[56] = fma52lo(res[56], a[27], a[29]); // Sum(56)
    res[57] = fma52hi(res[57], a[27], a[29]); // Sum(56)
    res[57] = fma52lo(res[57], a[28], a[29]); // Sum(57)
    res[58] = fma52hi(res[58], a[28], a[29]); // Sum(57)
    res[48] = fma52lo(res[48], a[18], a[30]); // Sum(48)
    res[49] = fma52hi(res[49], a[18], a[30]); // Sum(48)
    res[49] = fma52lo(res[49], a[19], a[30]); // Sum(49)
    res[50] = fma52hi(res[50], a[19], a[30]); // Sum(49)
    res[50] = fma52lo(res[50], a[20], a[30]); // Sum(50)
    res[51] = fma52hi(res[51], a[20], a[30]); // Sum(50)
    res[51] = fma52lo(res[51], a[21], a[30]); // Sum(51)
    res[52] = fma52hi(res[52], a[21], a[30]); // Sum(51)
    res[52] = fma52lo(res[52], a[22], a[30]); // Sum(52)
    res[53] = fma52hi(res[53], a[22], a[30]); // Sum(52)
    res[53] = fma52lo(res[53], a[23], a[30]); // Sum(53)
    res[54] = fma52hi(res[54], a[23], a[30]); // Sum(53)
    res[54] = fma52lo(res[54], a[24], a[30]); // Sum(54)
    res[55] = fma52hi(res[55], a[24], a[30]); // Sum(54)
    res[55] = fma52lo(res[55], a[25], a[30]); // Sum(55)
    res[56] = fma52hi(res[56], a[25], a[30]); // Sum(55)
    res[56] = fma52lo(res[56], a[26], a[30]); // Sum(56)
    res[57] = fma52hi(res[57], a[26], a[30]); // Sum(56)
    res[57] = fma52lo(res[57], a[27], a[30]); // Sum(57)
    res[58] = fma52hi(res[58], a[27], a[30]); // Sum(57)
    res[58] = fma52lo(res[58], a[28], a[30]); // Sum(58)
    res[59] = fma52hi(res[59], a[28], a[30]); // Sum(58)
    res[59] = fma52lo(res[59], a[29], a[30]); // Sum(59)
    res[60] = fma52hi(res[60], a[29], a[30]); // Sum(59)
    res[48] = fma52lo(res[48], a[17], a[31]); // Sum(48)
    res[49] = fma52hi(res[49], a[17], a[31]); // Sum(48)
    res[49] = fma52lo(res[49], a[18], a[31]); // Sum(49)
    res[50] = fma52hi(res[50], a[18], a[31]); // Sum(49)
    res[50] = fma52lo(res[50], a[19], a[31]); // Sum(50)
    res[51] = fma52hi(res[51], a[19], a[31]); // Sum(50)
    res[51] = fma52lo(res[51], a[20], a[31]); // Sum(51)
    res[52] = fma52hi(res[52], a[20], a[31]); // Sum(51)
    res[52] = fma52lo(res[52], a[21], a[31]); // Sum(52)
    res[53] = fma52hi(res[53], a[21], a[31]); // Sum(52)
    res[53] = fma52lo(res[53], a[22], a[31]); // Sum(53)
    res[54] = fma52hi(res[54], a[22], a[31]); // Sum(53)
    res[54] = fma52lo(res[54], a[23], a[31]); // Sum(54)
    res[55] = fma52hi(res[55], a[23], a[31]); // Sum(54)
    res[55] = fma52lo(res[55], a[24], a[31]); // Sum(55)
    res[56] = fma52hi(res[56], a[24], a[31]); // Sum(55)
    res[56] = fma52lo(res[56], a[25], a[31]); // Sum(56)
    res[57] = fma52hi(res[57], a[25], a[31]); // Sum(56)
    res[57] = fma52lo(res[57], a[26], a[31]); // Sum(57)
    res[58] = fma52hi(res[58], a[26], a[31]); // Sum(57)
    res[58] = fma52lo(res[58], a[27], a[31]); // Sum(58)
    res[59] = fma52hi(res[59], a[27], a[31]); // Sum(58)
    res[59] = fma52lo(res[59], a[28], a[31]); // Sum(59)
    res[60] = fma52hi(res[60], a[28], a[31]); // Sum(59)
    res[48] = fma52lo(res[48], a[16], a[32]); // Sum(48)
    res[49] = fma52hi(res[49], a[16], a[32]); // Sum(48)
    res[49] = fma52lo(res[49], a[17], a[32]); // Sum(49)
    res[50] = fma52hi(res[50], a[17], a[32]); // Sum(49)
    res[50] = fma52lo(res[50], a[18], a[32]); // Sum(50)
    res[51] = fma52hi(res[51], a[18], a[32]); // Sum(50)
    res[51] = fma52lo(res[51], a[19], a[32]); // Sum(51)
    res[52] = fma52hi(res[52], a[19], a[32]); // Sum(51)
    res[52] = fma52lo(res[52], a[20], a[32]); // Sum(52)
    res[53] = fma52hi(res[53], a[20], a[32]); // Sum(52)
    res[53] = fma52lo(res[53], a[21], a[32]); // Sum(53)
    res[54] = fma52hi(res[54], a[21], a[32]); // Sum(53)
    res[54] = fma52lo(res[54], a[22], a[32]); // Sum(54)
    res[55] = fma52hi(res[55], a[22], a[32]); // Sum(54)
    res[55] = fma52lo(res[55], a[23], a[32]); // Sum(55)
    res[56] = fma52hi(res[56], a[23], a[32]); // Sum(55)
    res[56] = fma52lo(res[56], a[24], a[32]); // Sum(56)
    res[57] = fma52hi(res[57], a[24], a[32]); // Sum(56)
    res[57] = fma52lo(res[57], a[25], a[32]); // Sum(57)
    res[58] = fma52hi(res[58], a[25], a[32]); // Sum(57)
    res[58] = fma52lo(res[58], a[26], a[32]); // Sum(58)
    res[59] = fma52hi(res[59], a[26], a[32]); // Sum(58)
    res[59] = fma52lo(res[59], a[27], a[32]); // Sum(59)
    res[60] = fma52hi(res[60], a[27], a[32]); // Sum(59)
    res[48] = fma52lo(res[48], a[15], a[33]); // Sum(48)
    res[49] = fma52hi(res[49], a[15], a[33]); // Sum(48)
    res[49] = fma52lo(res[49], a[16], a[33]); // Sum(49)
    res[50] = fma52hi(res[50], a[16], a[33]); // Sum(49)
    res[50] = fma52lo(res[50], a[17], a[33]); // Sum(50)
    res[51] = fma52hi(res[51], a[17], a[33]); // Sum(50)
    res[51] = fma52lo(res[51], a[18], a[33]); // Sum(51)
    res[52] = fma52hi(res[52], a[18], a[33]); // Sum(51)
    res[52] = fma52lo(res[52], a[19], a[33]); // Sum(52)
    res[53] = fma52hi(res[53], a[19], a[33]); // Sum(52)
    res[53] = fma52lo(res[53], a[20], a[33]); // Sum(53)
    res[54] = fma52hi(res[54], a[20], a[33]); // Sum(53)
    res[54] = fma52lo(res[54], a[21], a[33]); // Sum(54)
    res[55] = fma52hi(res[55], a[21], a[33]); // Sum(54)
    res[55] = fma52lo(res[55], a[22], a[33]); // Sum(55)
    res[56] = fma52hi(res[56], a[22], a[33]); // Sum(55)
    res[56] = fma52lo(res[56], a[23], a[33]); // Sum(56)
    res[57] = fma52hi(res[57], a[23], a[33]); // Sum(56)
    res[57] = fma52lo(res[57], a[24], a[33]); // Sum(57)
    res[58] = fma52hi(res[58], a[24], a[33]); // Sum(57)
    res[58] = fma52lo(res[58], a[25], a[33]); // Sum(58)
    res[59] = fma52hi(res[59], a[25], a[33]); // Sum(58)
    res[59] = fma52lo(res[59], a[26], a[33]); // Sum(59)
    res[60] = fma52hi(res[60], a[26], a[33]); // Sum(59)
    res[48] = fma52lo(res[48], a[14], a[34]); // Sum(48)
    res[49] = fma52hi(res[49], a[14], a[34]); // Sum(48)
    res[49] = fma52lo(res[49], a[15], a[34]); // Sum(49)
    res[50] = fma52hi(res[50], a[15], a[34]); // Sum(49)
    res[50] = fma52lo(res[50], a[16], a[34]); // Sum(50)
    res[51] = fma52hi(res[51], a[16], a[34]); // Sum(50)
    res[51] = fma52lo(res[51], a[17], a[34]); // Sum(51)
    res[52] = fma52hi(res[52], a[17], a[34]); // Sum(51)
    res[52] = fma52lo(res[52], a[18], a[34]); // Sum(52)
    res[53] = fma52hi(res[53], a[18], a[34]); // Sum(52)
    res[53] = fma52lo(res[53], a[19], a[34]); // Sum(53)
    res[54] = fma52hi(res[54], a[19], a[34]); // Sum(53)
    res[54] = fma52lo(res[54], a[20], a[34]); // Sum(54)
    res[55] = fma52hi(res[55], a[20], a[34]); // Sum(54)
    res[55] = fma52lo(res[55], a[21], a[34]); // Sum(55)
    res[56] = fma52hi(res[56], a[21], a[34]); // Sum(55)
    res[56] = fma52lo(res[56], a[22], a[34]); // Sum(56)
    res[57] = fma52hi(res[57], a[22], a[34]); // Sum(56)
    res[57] = fma52lo(res[57], a[23], a[34]); // Sum(57)
    res[58] = fma52hi(res[58], a[23], a[34]); // Sum(57)
    res[58] = fma52lo(res[58], a[24], a[34]); // Sum(58)
    res[59] = fma52hi(res[59], a[24], a[34]); // Sum(58)
    res[59] = fma52lo(res[59], a[25], a[34]); // Sum(59)
    res[60] = fma52hi(res[60], a[25], a[34]); // Sum(59)
    res[48] = fma52lo(res[48], a[13], a[35]); // Sum(48)
    res[49] = fma52hi(res[49], a[13], a[35]); // Sum(48)
    res[49] = fma52lo(res[49], a[14], a[35]); // Sum(49)
    res[50] = fma52hi(res[50], a[14], a[35]); // Sum(49)
    res[50] = fma52lo(res[50], a[15], a[35]); // Sum(50)
    res[51] = fma52hi(res[51], a[15], a[35]); // Sum(50)
    res[51] = fma52lo(res[51], a[16], a[35]); // Sum(51)
    res[52] = fma52hi(res[52], a[16], a[35]); // Sum(51)
    res[52] = fma52lo(res[52], a[17], a[35]); // Sum(52)
    res[53] = fma52hi(res[53], a[17], a[35]); // Sum(52)
    res[53] = fma52lo(res[53], a[18], a[35]); // Sum(53)
    res[54] = fma52hi(res[54], a[18], a[35]); // Sum(53)
    res[54] = fma52lo(res[54], a[19], a[35]); // Sum(54)
    res[55] = fma52hi(res[55], a[19], a[35]); // Sum(54)
    res[55] = fma52lo(res[55], a[20], a[35]); // Sum(55)
    res[56] = fma52hi(res[56], a[20], a[35]); // Sum(55)
    res[56] = fma52lo(res[56], a[21], a[35]); // Sum(56)
    res[57] = fma52hi(res[57], a[21], a[35]); // Sum(56)
    res[57] = fma52lo(res[57], a[22], a[35]); // Sum(57)
    res[58] = fma52hi(res[58], a[22], a[35]); // Sum(57)
    res[58] = fma52lo(res[58], a[23], a[35]); // Sum(58)
    res[59] = fma52hi(res[59], a[23], a[35]); // Sum(58)
    res[59] = fma52lo(res[59], a[24], a[35]); // Sum(59)
    res[60] = fma52hi(res[60], a[24], a[35]); // Sum(59)
    res[48] = fma52lo(res[48], a[12], a[36]); // Sum(48)
    res[49] = fma52hi(res[49], a[12], a[36]); // Sum(48)
    res[49] = fma52lo(res[49], a[13], a[36]); // Sum(49)
    res[50] = fma52hi(res[50], a[13], a[36]); // Sum(49)
    res[50] = fma52lo(res[50], a[14], a[36]); // Sum(50)
    res[51] = fma52hi(res[51], a[14], a[36]); // Sum(50)
    res[51] = fma52lo(res[51], a[15], a[36]); // Sum(51)
    res[52] = fma52hi(res[52], a[15], a[36]); // Sum(51)
    res[52] = fma52lo(res[52], a[16], a[36]); // Sum(52)
    res[53] = fma52hi(res[53], a[16], a[36]); // Sum(52)
    res[53] = fma52lo(res[53], a[17], a[36]); // Sum(53)
    res[54] = fma52hi(res[54], a[17], a[36]); // Sum(53)
    res[54] = fma52lo(res[54], a[18], a[36]); // Sum(54)
    res[55] = fma52hi(res[55], a[18], a[36]); // Sum(54)
    res[55] = fma52lo(res[55], a[19], a[36]); // Sum(55)
    res[56] = fma52hi(res[56], a[19], a[36]); // Sum(55)
    res[56] = fma52lo(res[56], a[20], a[36]); // Sum(56)
    res[57] = fma52hi(res[57], a[20], a[36]); // Sum(56)
    res[57] = fma52lo(res[57], a[21], a[36]); // Sum(57)
    res[58] = fma52hi(res[58], a[21], a[36]); // Sum(57)
    res[58] = fma52lo(res[58], a[22], a[36]); // Sum(58)
    res[59] = fma52hi(res[59], a[22], a[36]); // Sum(58)
    res[59] = fma52lo(res[59], a[23], a[36]); // Sum(59)
    res[60] = fma52hi(res[60], a[23], a[36]); // Sum(59)
    res[48] = fma52lo(res[48], a[11], a[37]); // Sum(48)
    res[49] = fma52hi(res[49], a[11], a[37]); // Sum(48)
    res[49] = fma52lo(res[49], a[12], a[37]); // Sum(49)
    res[50] = fma52hi(res[50], a[12], a[37]); // Sum(49)
    res[50] = fma52lo(res[50], a[13], a[37]); // Sum(50)
    res[51] = fma52hi(res[51], a[13], a[37]); // Sum(50)
    res[51] = fma52lo(res[51], a[14], a[37]); // Sum(51)
    res[52] = fma52hi(res[52], a[14], a[37]); // Sum(51)
    res[52] = fma52lo(res[52], a[15], a[37]); // Sum(52)
    res[53] = fma52hi(res[53], a[15], a[37]); // Sum(52)
    res[53] = fma52lo(res[53], a[16], a[37]); // Sum(53)
    res[54] = fma52hi(res[54], a[16], a[37]); // Sum(53)
    res[54] = fma52lo(res[54], a[17], a[37]); // Sum(54)
    res[55] = fma52hi(res[55], a[17], a[37]); // Sum(54)
    res[55] = fma52lo(res[55], a[18], a[37]); // Sum(55)
    res[56] = fma52hi(res[56], a[18], a[37]); // Sum(55)
    res[56] = fma52lo(res[56], a[19], a[37]); // Sum(56)
    res[57] = fma52hi(res[57], a[19], a[37]); // Sum(56)
    res[57] = fma52lo(res[57], a[20], a[37]); // Sum(57)
    res[58] = fma52hi(res[58], a[20], a[37]); // Sum(57)
    res[58] = fma52lo(res[58], a[21], a[37]); // Sum(58)
    res[59] = fma52hi(res[59], a[21], a[37]); // Sum(58)
    res[59] = fma52lo(res[59], a[22], a[37]); // Sum(59)
    res[60] = fma52hi(res[60], a[22], a[37]); // Sum(59)
    res[48] = fma52lo(res[48], a[10], a[38]); // Sum(48)
    res[49] = fma52hi(res[49], a[10], a[38]); // Sum(48)
    res[49] = fma52lo(res[49], a[11], a[38]); // Sum(49)
    res[50] = fma52hi(res[50], a[11], a[38]); // Sum(49)
    res[50] = fma52lo(res[50], a[12], a[38]); // Sum(50)
    res[51] = fma52hi(res[51], a[12], a[38]); // Sum(50)
    res[51] = fma52lo(res[51], a[13], a[38]); // Sum(51)
    res[52] = fma52hi(res[52], a[13], a[38]); // Sum(51)
    res[52] = fma52lo(res[52], a[14], a[38]); // Sum(52)
    res[53] = fma52hi(res[53], a[14], a[38]); // Sum(52)
    res[53] = fma52lo(res[53], a[15], a[38]); // Sum(53)
    res[54] = fma52hi(res[54], a[15], a[38]); // Sum(53)
    res[54] = fma52lo(res[54], a[16], a[38]); // Sum(54)
    res[55] = fma52hi(res[55], a[16], a[38]); // Sum(54)
    res[55] = fma52lo(res[55], a[17], a[38]); // Sum(55)
    res[56] = fma52hi(res[56], a[17], a[38]); // Sum(55)
    res[56] = fma52lo(res[56], a[18], a[38]); // Sum(56)
    res[57] = fma52hi(res[57], a[18], a[38]); // Sum(56)
    res[57] = fma52lo(res[57], a[19], a[38]); // Sum(57)
    res[58] = fma52hi(res[58], a[19], a[38]); // Sum(57)
    res[58] = fma52lo(res[58], a[20], a[38]); // Sum(58)
    res[59] = fma52hi(res[59], a[20], a[38]); // Sum(58)
    res[59] = fma52lo(res[59], a[21], a[38]); // Sum(59)
    res[60] = fma52hi(res[60], a[21], a[38]); // Sum(59)
    res[48] = fma52lo(res[48], a[9], a[39]);  // Sum(48)
    res[49] = fma52hi(res[49], a[9], a[39]);  // Sum(48)
    res[49] = fma52lo(res[49], a[10], a[39]); // Sum(49)
    res[50] = fma52hi(res[50], a[10], a[39]); // Sum(49)
    res[50] = fma52lo(res[50], a[11], a[39]); // Sum(50)
    res[51] = fma52hi(res[51], a[11], a[39]); // Sum(50)
    res[51] = fma52lo(res[51], a[12], a[39]); // Sum(51)
    res[52] = fma52hi(res[52], a[12], a[39]); // Sum(51)
    res[52] = fma52lo(res[52], a[13], a[39]); // Sum(52)
    res[53] = fma52hi(res[53], a[13], a[39]); // Sum(52)
    res[53] = fma52lo(res[53], a[14], a[39]); // Sum(53)
    res[54] = fma52hi(res[54], a[14], a[39]); // Sum(53)
    res[54] = fma52lo(res[54], a[15], a[39]); // Sum(54)
    res[55] = fma52hi(res[55], a[15], a[39]); // Sum(54)
    res[55] = fma52lo(res[55], a[16], a[39]); // Sum(55)
    res[56] = fma52hi(res[56], a[16], a[39]); // Sum(55)
    res[56] = fma52lo(res[56], a[17], a[39]); // Sum(56)
    res[57] = fma52hi(res[57], a[17], a[39]); // Sum(56)
    res[57] = fma52lo(res[57], a[18], a[39]); // Sum(57)
    res[58] = fma52hi(res[58], a[18], a[39]); // Sum(57)
    res[58] = fma52lo(res[58], a[19], a[39]); // Sum(58)
    res[59] = fma52hi(res[59], a[19], a[39]); // Sum(58)
    res[59] = fma52lo(res[59], a[20], a[39]); // Sum(59)
    res[60] = fma52hi(res[60], a[20], a[39]); // Sum(59)
    res[48] = add64(res[48], res[48]);        // Double(48)
    res[49] = add64(res[49], res[49]);        // Double(49)
    res[50] = add64(res[50], res[50]);        // Double(50)
    res[51] = add64(res[51], res[51]);        // Double(51)
    res[52] = add64(res[52], res[52]);        // Double(52)
    res[53] = add64(res[53], res[53]);        // Double(53)
    res[54] = add64(res[54], res[54]);        // Double(54)
    res[55] = add64(res[55], res[55]);        // Double(55)
    res[56] = add64(res[56], res[56]);        // Double(56)
    res[57] = add64(res[57], res[57]);        // Double(57)
    res[58] = add64(res[58], res[58]);        // Double(58)
    res[59] = add64(res[59], res[59]);        // Double(59)
    res[48] = fma52lo(res[48], a[24], a[24]); // Add sqr(48)
    res[49] = fma52hi(res[49], a[24], a[24]); // Add sqr(48)
    res[50] = fma52lo(res[50], a[25], a[25]); // Add sqr(50)
    res[51] = fma52hi(res[51], a[25], a[25]); // Add sqr(50)
    res[52] = fma52lo(res[52], a[26], a[26]); // Add sqr(52)
    res[53] = fma52hi(res[53], a[26], a[26]); // Add sqr(52)
    res[54] = fma52lo(res[54], a[27], a[27]); // Add sqr(54)
    res[55] = fma52hi(res[55], a[27], a[27]); // Add sqr(54)
    res[56] = fma52lo(res[56], a[28], a[28]); // Add sqr(56)
    res[57] = fma52hi(res[57], a[28], a[28]); // Add sqr(56)
    res[58] = fma52lo(res[58], a[29], a[29]); // Add sqr(58)
    res[59] = fma52hi(res[59], a[29], a[29]); // Add sqr(58)
    res[60] = fma52lo(res[60], a[29], a[31]); // Sum(60)
    res[61] = fma52hi(res[61], a[29], a[31]); // Sum(60)
    res[61] = fma52lo(res[61], a[30], a[31]); // Sum(61)
    res[62] = fma52hi(res[62], a[30], a[31]); // Sum(61)
    res[60] = fma52lo(res[60], a[28], a[32]); // Sum(60)
    res[61] = fma52hi(res[61], a[28], a[32]); // Sum(60)
    res[61] = fma52lo(res[61], a[29], a[32]); // Sum(61)
    res[62] = fma52hi(res[62], a[29], a[32]); // Sum(61)
    res[62] = fma52lo(res[62], a[30], a[32]); // Sum(62)
    res[63] = fma52hi(res[63], a[30], a[32]); // Sum(62)
    res[63] = fma52lo(res[63], a[31], a[32]); // Sum(63)
    res[64] = fma52hi(res[64], a[31], a[32]); // Sum(63)
    res[60] = fma52lo(res[60], a[27], a[33]); // Sum(60)
    res[61] = fma52hi(res[61], a[27], a[33]); // Sum(60)
    res[61] = fma52lo(res[61], a[28], a[33]); // Sum(61)
    res[62] = fma52hi(res[62], a[28], a[33]); // Sum(61)
    res[62] = fma52lo(res[62], a[29], a[33]); // Sum(62)
    res[63] = fma52hi(res[63], a[29], a[33]); // Sum(62)
    res[63] = fma52lo(res[63], a[30], a[33]); // Sum(63)
    res[64] = fma52hi(res[64], a[30], a[33]); // Sum(63)
    res[64] = fma52lo(res[64], a[31], a[33]); // Sum(64)
    res[65] = fma52hi(res[65], a[31], a[33]); // Sum(64)
    res[65] = fma52lo(res[65], a[32], a[33]); // Sum(65)
    res[66] = fma52hi(res[66], a[32], a[33]); // Sum(65)
    res[60] = fma52lo(res[60], a[26], a[34]); // Sum(60)
    res[61] = fma52hi(res[61], a[26], a[34]); // Sum(60)
    res[61] = fma52lo(res[61], a[27], a[34]); // Sum(61)
    res[62] = fma52hi(res[62], a[27], a[34]); // Sum(61)
    res[62] = fma52lo(res[62], a[28], a[34]); // Sum(62)
    res[63] = fma52hi(res[63], a[28], a[34]); // Sum(62)
    res[63] = fma52lo(res[63], a[29], a[34]); // Sum(63)
    res[64] = fma52hi(res[64], a[29], a[34]); // Sum(63)
    res[64] = fma52lo(res[64], a[30], a[34]); // Sum(64)
    res[65] = fma52hi(res[65], a[30], a[34]); // Sum(64)
    res[65] = fma52lo(res[65], a[31], a[34]); // Sum(65)
    res[66] = fma52hi(res[66], a[31], a[34]); // Sum(65)
    res[66] = fma52lo(res[66], a[32], a[34]); // Sum(66)
    res[67] = fma52hi(res[67], a[32], a[34]); // Sum(66)
    res[67] = fma52lo(res[67], a[33], a[34]); // Sum(67)
    res[68] = fma52hi(res[68], a[33], a[34]); // Sum(67)
    res[60] = fma52lo(res[60], a[25], a[35]); // Sum(60)
    res[61] = fma52hi(res[61], a[25], a[35]); // Sum(60)
    res[61] = fma52lo(res[61], a[26], a[35]); // Sum(61)
    res[62] = fma52hi(res[62], a[26], a[35]); // Sum(61)
    res[62] = fma52lo(res[62], a[27], a[35]); // Sum(62)
    res[63] = fma52hi(res[63], a[27], a[35]); // Sum(62)
    res[63] = fma52lo(res[63], a[28], a[35]); // Sum(63)
    res[64] = fma52hi(res[64], a[28], a[35]); // Sum(63)
    res[64] = fma52lo(res[64], a[29], a[35]); // Sum(64)
    res[65] = fma52hi(res[65], a[29], a[35]); // Sum(64)
    res[65] = fma52lo(res[65], a[30], a[35]); // Sum(65)
    res[66] = fma52hi(res[66], a[30], a[35]); // Sum(65)
    res[66] = fma52lo(res[66], a[31], a[35]); // Sum(66)
    res[67] = fma52hi(res[67], a[31], a[35]); // Sum(66)
    res[67] = fma52lo(res[67], a[32], a[35]); // Sum(67)
    res[68] = fma52hi(res[68], a[32], a[35]); // Sum(67)
    res[68] = fma52lo(res[68], a[33], a[35]); // Sum(68)
    res[69] = fma52hi(res[69], a[33], a[35]); // Sum(68)
    res[69] = fma52lo(res[69], a[34], a[35]); // Sum(69)
    res[70] = fma52hi(res[70], a[34], a[35]); // Sum(69)
    res[60] = fma52lo(res[60], a[24], a[36]); // Sum(60)
    res[61] = fma52hi(res[61], a[24], a[36]); // Sum(60)
    res[61] = fma52lo(res[61], a[25], a[36]); // Sum(61)
    res[62] = fma52hi(res[62], a[25], a[36]); // Sum(61)
    res[62] = fma52lo(res[62], a[26], a[36]); // Sum(62)
    res[63] = fma52hi(res[63], a[26], a[36]); // Sum(62)
    res[63] = fma52lo(res[63], a[27], a[36]); // Sum(63)
    res[64] = fma52hi(res[64], a[27], a[36]); // Sum(63)
    res[64] = fma52lo(res[64], a[28], a[36]); // Sum(64)
    res[65] = fma52hi(res[65], a[28], a[36]); // Sum(64)
    res[65] = fma52lo(res[65], a[29], a[36]); // Sum(65)
    res[66] = fma52hi(res[66], a[29], a[36]); // Sum(65)
    res[66] = fma52lo(res[66], a[30], a[36]); // Sum(66)
    res[67] = fma52hi(res[67], a[30], a[36]); // Sum(66)
    res[67] = fma52lo(res[67], a[31], a[36]); // Sum(67)
    res[68] = fma52hi(res[68], a[31], a[36]); // Sum(67)
    res[68] = fma52lo(res[68], a[32], a[36]); // Sum(68)
    res[69] = fma52hi(res[69], a[32], a[36]); // Sum(68)
    res[69] = fma52lo(res[69], a[33], a[36]); // Sum(69)
    res[70] = fma52hi(res[70], a[33], a[36]); // Sum(69)
    res[70] = fma52lo(res[70], a[34], a[36]); // Sum(70)
    res[71] = fma52hi(res[71], a[34], a[36]); // Sum(70)
    res[71] = fma52lo(res[71], a[35], a[36]); // Sum(71)
    res[72] = fma52hi(res[72], a[35], a[36]); // Sum(71)
    res[60] = fma52lo(res[60], a[23], a[37]); // Sum(60)
    res[61] = fma52hi(res[61], a[23], a[37]); // Sum(60)
    res[61] = fma52lo(res[61], a[24], a[37]); // Sum(61)
    res[62] = fma52hi(res[62], a[24], a[37]); // Sum(61)
    res[62] = fma52lo(res[62], a[25], a[37]); // Sum(62)
    res[63] = fma52hi(res[63], a[25], a[37]); // Sum(62)
    res[63] = fma52lo(res[63], a[26], a[37]); // Sum(63)
    res[64] = fma52hi(res[64], a[26], a[37]); // Sum(63)
    res[64] = fma52lo(res[64], a[27], a[37]); // Sum(64)
    res[65] = fma52hi(res[65], a[27], a[37]); // Sum(64)
    res[65] = fma52lo(res[65], a[28], a[37]); // Sum(65)
    res[66] = fma52hi(res[66], a[28], a[37]); // Sum(65)
    res[66] = fma52lo(res[66], a[29], a[37]); // Sum(66)
    res[67] = fma52hi(res[67], a[29], a[37]); // Sum(66)
    res[67] = fma52lo(res[67], a[30], a[37]); // Sum(67)
    res[68] = fma52hi(res[68], a[30], a[37]); // Sum(67)
    res[68] = fma52lo(res[68], a[31], a[37]); // Sum(68)
    res[69] = fma52hi(res[69], a[31], a[37]); // Sum(68)
    res[69] = fma52lo(res[69], a[32], a[37]); // Sum(69)
    res[70] = fma52hi(res[70], a[32], a[37]); // Sum(69)
    res[70] = fma52lo(res[70], a[33], a[37]); // Sum(70)
    res[71] = fma52hi(res[71], a[33], a[37]); // Sum(70)
    res[71] = fma52lo(res[71], a[34], a[37]); // Sum(71)
    res[72] = fma52hi(res[72], a[34], a[37]); // Sum(71)
    res[60] = fma52lo(res[60], a[22], a[38]); // Sum(60)
    res[61] = fma52hi(res[61], a[22], a[38]); // Sum(60)
    res[61] = fma52lo(res[61], a[23], a[38]); // Sum(61)
    res[62] = fma52hi(res[62], a[23], a[38]); // Sum(61)
    res[62] = fma52lo(res[62], a[24], a[38]); // Sum(62)
    res[63] = fma52hi(res[63], a[24], a[38]); // Sum(62)
    res[63] = fma52lo(res[63], a[25], a[38]); // Sum(63)
    res[64] = fma52hi(res[64], a[25], a[38]); // Sum(63)
    res[64] = fma52lo(res[64], a[26], a[38]); // Sum(64)
    res[65] = fma52hi(res[65], a[26], a[38]); // Sum(64)
    res[65] = fma52lo(res[65], a[27], a[38]); // Sum(65)
    res[66] = fma52hi(res[66], a[27], a[38]); // Sum(65)
    res[66] = fma52lo(res[66], a[28], a[38]); // Sum(66)
    res[67] = fma52hi(res[67], a[28], a[38]); // Sum(66)
    res[67] = fma52lo(res[67], a[29], a[38]); // Sum(67)
    res[68] = fma52hi(res[68], a[29], a[38]); // Sum(67)
    res[68] = fma52lo(res[68], a[30], a[38]); // Sum(68)
    res[69] = fma52hi(res[69], a[30], a[38]); // Sum(68)
    res[69] = fma52lo(res[69], a[31], a[38]); // Sum(69)
    res[70] = fma52hi(res[70], a[31], a[38]); // Sum(69)
    res[70] = fma52lo(res[70], a[32], a[38]); // Sum(70)
    res[71] = fma52hi(res[71], a[32], a[38]); // Sum(70)
    res[71] = fma52lo(res[71], a[33], a[38]); // Sum(71)
    res[72] = fma52hi(res[72], a[33], a[38]); // Sum(71)
    res[60] = fma52lo(res[60], a[21], a[39]); // Sum(60)
    res[61] = fma52hi(res[61], a[21], a[39]); // Sum(60)
    res[61] = fma52lo(res[61], a[22], a[39]); // Sum(61)
    res[62] = fma52hi(res[62], a[22], a[39]); // Sum(61)
    res[62] = fma52lo(res[62], a[23], a[39]); // Sum(62)
    res[63] = fma52hi(res[63], a[23], a[39]); // Sum(62)
    res[63] = fma52lo(res[63], a[24], a[39]); // Sum(63)
    res[64] = fma52hi(res[64], a[24], a[39]); // Sum(63)
    res[64] = fma52lo(res[64], a[25], a[39]); // Sum(64)
    res[65] = fma52hi(res[65], a[25], a[39]); // Sum(64)
    res[65] = fma52lo(res[65], a[26], a[39]); // Sum(65)
    res[66] = fma52hi(res[66], a[26], a[39]); // Sum(65)
    res[66] = fma52lo(res[66], a[27], a[39]); // Sum(66)
    res[67] = fma52hi(res[67], a[27], a[39]); // Sum(66)
    res[67] = fma52lo(res[67], a[28], a[39]); // Sum(67)
    res[68] = fma52hi(res[68], a[28], a[39]); // Sum(67)
    res[68] = fma52lo(res[68], a[29], a[39]); // Sum(68)
    res[69] = fma52hi(res[69], a[29], a[39]); // Sum(68)
    res[69] = fma52lo(res[69], a[30], a[39]); // Sum(69)
    res[70] = fma52hi(res[70], a[30], a[39]); // Sum(69)
    res[70] = fma52lo(res[70], a[31], a[39]); // Sum(70)
    res[71] = fma52hi(res[71], a[31], a[39]); // Sum(70)
    res[71] = fma52lo(res[71], a[32], a[39]); // Sum(71)
    res[72] = fma52hi(res[72], a[32], a[39]); // Sum(71)
    res[60] = add64(res[60], res[60]);        // Double(60)
    res[61] = add64(res[61], res[61]);        // Double(61)
    res[62] = add64(res[62], res[62]);        // Double(62)
    res[63] = add64(res[63], res[63]);        // Double(63)
    res[64] = add64(res[64], res[64]);        // Double(64)
    res[65] = add64(res[65], res[65]);        // Double(65)
    res[66] = add64(res[66], res[66]);        // Double(66)
    res[67] = add64(res[67], res[67]);        // Double(67)
    res[68] = add64(res[68], res[68]);        // Double(68)
    res[69] = add64(res[69], res[69]);        // Double(69)
    res[70] = add64(res[70], res[70]);        // Double(70)
    res[71] = add64(res[71], res[71]);        // Double(71)
    res[60] = fma52lo(res[60], a[30], a[30]); // Add sqr(60)
    res[61] = fma52hi(res[61], a[30], a[30]); // Add sqr(60)
    res[62] = fma52lo(res[62], a[31], a[31]); // Add sqr(62)
    res[63] = fma52hi(res[63], a[31], a[31]); // Add sqr(62)
    res[64] = fma52lo(res[64], a[32], a[32]); // Add sqr(64)
    res[65] = fma52hi(res[65], a[32], a[32]); // Add sqr(64)
    res[66] = fma52lo(res[66], a[33], a[33]); // Add sqr(66)
    res[67] = fma52hi(res[67], a[33], a[33]); // Add sqr(66)
    res[68] = fma52lo(res[68], a[34], a[34]); // Add sqr(68)
    res[69] = fma52hi(res[69], a[34], a[34]); // Add sqr(68)
    res[70] = fma52lo(res[70], a[35], a[35]); // Add sqr(70)
    res[71] = fma52hi(res[71], a[35], a[35]); // Add sqr(70)
    res[72] = fma52lo(res[72], a[35], a[37]); // Sum(72)
    res[73] = fma52hi(res[73], a[35], a[37]); // Sum(72)
    res[73] = fma52lo(res[73], a[36], a[37]); // Sum(73)
    res[74] = fma52hi(res[74], a[36], a[37]); // Sum(73)
    res[72] = fma52lo(res[72], a[34], a[38]); // Sum(72)
    res[73] = fma52hi(res[73], a[34], a[38]); // Sum(72)
    res[73] = fma52lo(res[73], a[35], a[38]); // Sum(73)
    res[74] = fma52hi(res[74], a[35], a[38]); // Sum(73)
    res[74] = fma52lo(res[74], a[36], a[38]); // Sum(74)
    res[75] = fma52hi(res[75], a[36], a[38]); // Sum(74)
    res[75] = fma52lo(res[75], a[37], a[38]); // Sum(75)
    res[76] = fma52hi(res[76], a[37], a[38]); // Sum(75)
    res[72] = fma52lo(res[72], a[33], a[39]); // Sum(72)
    res[73] = fma52hi(res[73], a[33], a[39]); // Sum(72)
    res[73] = fma52lo(res[73], a[34], a[39]); // Sum(73)
    res[74] = fma52hi(res[74], a[34], a[39]); // Sum(73)
    res[74] = fma52lo(res[74], a[35], a[39]); // Sum(74)
    res[75] = fma52hi(res[75], a[35], a[39]); // Sum(74)
    res[75] = fma52lo(res[75], a[36], a[39]); // Sum(75)
    res[76] = fma52hi(res[76], a[36], a[39]); // Sum(75)
    res[76] = fma52lo(res[76], a[37], a[39]); // Sum(76)
    res[77] = fma52hi(res[77], a[37], a[39]); // Sum(76)
    res[77] = fma52lo(res[77], a[38], a[39]); // Sum(77)
    res[78] = fma52hi(res[78], a[38], a[39]); // Sum(77)
    res[72] = add64(res[72], res[72]);        // Double(72)
    res[73] = add64(res[73], res[73]);        // Double(73)
    res[74] = add64(res[74], res[74]);        // Double(74)
    res[75] = add64(res[75], res[75]);        // Double(75)
    res[76] = add64(res[76], res[76]);        // Double(76)
    res[77] = add64(res[77], res[77]);        // Double(77)
    res[78] = add64(res[78], res[78]);        // Double(78)
    res[72] = fma52lo(res[72], a[36], a[36]); // Add sqr(72)
    res[73] = fma52hi(res[73], a[36], a[36]); // Add sqr(72)
    res[74] = fma52lo(res[74], a[37], a[37]); // Add sqr(74)
    res[75] = fma52hi(res[75], a[37], a[37]); // Add sqr(74)
    res[76] = fma52lo(res[76], a[38], a[38]); // Add sqr(76)
    res[77] = fma52hi(res[77], a[38], a[38]); // Add sqr(76)
    res[78] = fma52lo(res[78], a[39], a[39]); // Add sqr(78)
    res[79] = fma52hi(res[79], a[39], a[39]); // Add sqr(78)

    // Montgomery Reduction
    // carry = get_zero64();
    int it;
    for (it = 0; it < 40; it += 10) { // Reduction step
      int jt = 0;
      if ((it + 0) > 0)
        res[it + 0] = add64(res[it + 0], srli64(res[it + -1], DIGIT_SIZE));
      u[it + 0] = mul52lo(res[it + 0], k);
      res[it + jt + 0] = fma52lo(res[it + jt + 0], u[it + 0], m[jt + 0]);
      res[it + jt + 1] = fma52hi(res[it + jt + 1], u[it + 0], m[jt + 0]);
      res[it + jt + 1] = fma52lo(res[it + jt + 1], u[it + 0], m[jt + 1]);
      res[it + jt + 2] = fma52hi(res[it + jt + 2], u[it + 0], m[jt + 1]);
      res[it + jt + 2] = fma52lo(res[it + jt + 2], u[it + 0], m[jt + 2]);
      res[it + jt + 3] = fma52hi(res[it + jt + 3], u[it + 0], m[jt + 2]);
      res[it + jt + 3] = fma52lo(res[it + jt + 3], u[it + 0], m[jt + 3]);
      res[it + jt + 4] = fma52hi(res[it + jt + 4], u[it + 0], m[jt + 3]);
      res[it + jt + 4] = fma52lo(res[it + jt + 4], u[it + 0], m[jt + 4]);
      res[it + jt + 5] = fma52hi(res[it + jt + 5], u[it + 0], m[jt + 4]);
      res[it + jt + 5] = fma52lo(res[it + jt + 5], u[it + 0], m[jt + 5]);
      res[it + jt + 6] = fma52hi(res[it + jt + 6], u[it + 0], m[jt + 5]);
      res[it + jt + 6] = fma52lo(res[it + jt + 6], u[it + 0], m[jt + 6]);
      res[it + jt + 7] = fma52hi(res[it + jt + 7], u[it + 0], m[jt + 6]);
      res[it + jt + 7] = fma52lo(res[it + jt + 7], u[it + 0], m[jt + 7]);
      res[it + jt + 8] = fma52hi(res[it + jt + 8], u[it + 0], m[jt + 7]);
      res[it + jt + 8] = fma52lo(res[it + jt + 8], u[it + 0], m[jt + 8]);
      res[it + jt + 9] = fma52hi(res[it + jt + 9], u[it + 0], m[jt + 8]);
      res[it + jt + 9] = fma52lo(res[it + jt + 9], u[it + 0], m[jt + 9]);
      res[it + jt + 10] = fma52hi(res[it + jt + 10], u[it + 0], m[jt + 9]);
      res[it + 1] = add64(res[it + 1], srli64(res[it + 0], DIGIT_SIZE));
      u[it + 1] = mul52lo(res[it + 1], k);
      res[it + jt + 1] = fma52lo(res[it + jt + 1], u[it + 1], m[jt + 0]);
      res[it + jt + 2] = fma52hi(res[it + jt + 2], u[it + 1], m[jt + 0]);
      res[it + jt + 2] = fma52lo(res[it + jt + 2], u[it + 1], m[jt + 1]);
      res[it + jt + 3] = fma52hi(res[it + jt + 3], u[it + 1], m[jt + 1]);
      res[it + jt + 3] = fma52lo(res[it + jt + 3], u[it + 1], m[jt + 2]);
      res[it + jt + 4] = fma52hi(res[it + jt + 4], u[it + 1], m[jt + 2]);
      res[it + jt + 4] = fma52lo(res[it + jt + 4], u[it + 1], m[jt + 3]);
      res[it + jt + 5] = fma52hi(res[it + jt + 5], u[it + 1], m[jt + 3]);
      res[it + jt + 5] = fma52lo(res[it + jt + 5], u[it + 1], m[jt + 4]);
      res[it + jt + 6] = fma52hi(res[it + jt + 6], u[it + 1], m[jt + 4]);
      res[it + jt + 6] = fma52lo(res[it + jt + 6], u[it + 1], m[jt + 5]);
      res[it + jt + 7] = fma52hi(res[it + jt + 7], u[it + 1], m[jt + 5]);
      res[it + jt + 7] = fma52lo(res[it + jt + 7], u[it + 1], m[jt + 6]);
      res[it + jt + 8] = fma52hi(res[it + jt + 8], u[it + 1], m[jt + 6]);
      res[it + jt + 8] = fma52lo(res[it + jt + 8], u[it + 1], m[jt + 7]);
      res[it + jt + 9] = fma52hi(res[it + jt + 9], u[it + 1], m[jt + 7]);
      res[it + jt + 9] = fma52lo(res[it + jt + 9], u[it + 1], m[jt + 8]);
      res[it + jt + 10] = fma52hi(res[it + jt + 10], u[it + 1], m[jt + 8]);
      res[it + jt + 10] = fma52lo(res[it + jt + 10], u[it + 1], m[jt + 9]);
      res[it + jt + 11] = fma52hi(res[it + jt + 11], u[it + 1], m[jt + 9]);
      res[it + 2] = add64(res[it + 2], srli64(res[it + 1], DIGIT_SIZE));
      u[it + 2] = mul52lo(res[it + 2], k);
      res[it + jt + 2] = fma52lo(res[it + jt + 2], u[it + 2], m[jt + 0]);
      res[it + jt + 3] = fma52hi(res[it + jt + 3], u[it + 2], m[jt + 0]);
      res[it + jt + 3] = fma52lo(res[it + jt + 3], u[it + 2], m[jt + 1]);
      res[it + jt + 4] = fma52hi(res[it + jt + 4], u[it + 2], m[jt + 1]);
      res[it + jt + 4] = fma52lo(res[it + jt + 4], u[it + 2], m[jt + 2]);
      res[it + jt + 5] = fma52hi(res[it + jt + 5], u[it + 2], m[jt + 2]);
      res[it + jt + 5] = fma52lo(res[it + jt + 5], u[it + 2], m[jt + 3]);
      res[it + jt + 6] = fma52hi(res[it + jt + 6], u[it + 2], m[jt + 3]);
      res[it + jt + 6] = fma52lo(res[it + jt + 6], u[it + 2], m[jt + 4]);
      res[it + jt + 7] = fma52hi(res[it + jt + 7], u[it + 2], m[jt + 4]);
      res[it + jt + 7] = fma52lo(res[it + jt + 7], u[it + 2], m[jt + 5]);
      res[it + jt + 8] = fma52hi(res[it + jt + 8], u[it + 2], m[jt + 5]);
      res[it + jt + 8] = fma52lo(res[it + jt + 8], u[it + 2], m[jt + 6]);
      res[it + jt + 9] = fma52hi(res[it + jt + 9], u[it + 2], m[jt + 6]);
      res[it + jt + 9] = fma52lo(res[it + jt + 9], u[it + 2], m[jt + 7]);
      res[it + jt + 10] = fma52hi(res[it + jt + 10], u[it + 2], m[jt + 7]);
      res[it + jt + 10] = fma52lo(res[it + jt + 10], u[it + 2], m[jt + 8]);
      res[it + jt + 11] = fma52hi(res[it + jt + 11], u[it + 2], m[jt + 8]);
      res[it + jt + 11] = fma52lo(res[it + jt + 11], u[it + 2], m[jt + 9]);
      res[it + jt + 12] = fma52hi(res[it + jt + 12], u[it + 2], m[jt + 9]);
      res[it + 3] = add64(res[it + 3], srli64(res[it + 2], DIGIT_SIZE));
      u[it + 3] = mul52lo(res[it + 3], k);
      res[it + jt + 3] = fma52lo(res[it + jt + 3], u[it + 3], m[jt + 0]);
      res[it + jt + 4] = fma52hi(res[it + jt + 4], u[it + 3], m[jt + 0]);
      res[it + jt + 4] = fma52lo(res[it + jt + 4], u[it + 3], m[jt + 1]);
      res[it + jt + 5] = fma52hi(res[it + jt + 5], u[it + 3], m[jt + 1]);
      res[it + jt + 5] = fma52lo(res[it + jt + 5], u[it + 3], m[jt + 2]);
      res[it + jt + 6] = fma52hi(res[it + jt + 6], u[it + 3], m[jt + 2]);
      res[it + jt + 6] = fma52lo(res[it + jt + 6], u[it + 3], m[jt + 3]);
      res[it + jt + 7] = fma52hi(res[it + jt + 7], u[it + 3], m[jt + 3]);
      res[it + jt + 7] = fma52lo(res[it + jt + 7], u[it + 3], m[jt + 4]);
      res[it + jt + 8] = fma52hi(res[it + jt + 8], u[it + 3], m[jt + 4]);
      res[it + jt + 8] = fma52lo(res[it + jt + 8], u[it + 3], m[jt + 5]);
      res[it + jt + 9] = fma52hi(res[it + jt + 9], u[it + 3], m[jt + 5]);
      res[it + jt + 9] = fma52lo(res[it + jt + 9], u[it + 3], m[jt + 6]);
      res[it + jt + 10] = fma52hi(res[it + jt + 10], u[it + 3], m[jt + 6]);
      res[it + jt + 10] = fma52lo(res[it + jt + 10], u[it + 3], m[jt + 7]);
      res[it + jt + 11] = fma52hi(res[it + jt + 11], u[it + 3], m[jt + 7]);
      res[it + jt + 11] = fma52lo(res[it + jt + 11], u[it + 3], m[jt + 8]);
      res[it + jt + 12] = fma52hi(res[it + jt + 12], u[it + 3], m[jt + 8]);
      res[it + jt + 12] = fma52lo(res[it + jt + 12], u[it + 3], m[jt + 9]);
      res[it + jt + 13] = fma52hi(res[it + jt + 13], u[it + 3], m[jt + 9]);
      res[it + 4] = add64(res[it + 4], srli64(res[it + 3], DIGIT_SIZE));
      u[it + 4] = mul52lo(res[it + 4], k);
      res[it + jt + 4] = fma52lo(res[it + jt + 4], u[it + 4], m[jt + 0]);
      res[it + jt + 5] = fma52hi(res[it + jt + 5], u[it + 4], m[jt + 0]);
      res[it + jt + 5] = fma52lo(res[it + jt + 5], u[it + 4], m[jt + 1]);
      res[it + jt + 6] = fma52hi(res[it + jt + 6], u[it + 4], m[jt + 1]);
      res[it + jt + 6] = fma52lo(res[it + jt + 6], u[it + 4], m[jt + 2]);
      res[it + jt + 7] = fma52hi(res[it + jt + 7], u[it + 4], m[jt + 2]);
      res[it + jt + 7] = fma52lo(res[it + jt + 7], u[it + 4], m[jt + 3]);
      res[it + jt + 8] = fma52hi(res[it + jt + 8], u[it + 4], m[jt + 3]);
      res[it + jt + 8] = fma52lo(res[it + jt + 8], u[it + 4], m[jt + 4]);
      res[it + jt + 9] = fma52hi(res[it + jt + 9], u[it + 4], m[jt + 4]);
      res[it + jt + 9] = fma52lo(res[it + jt + 9], u[it + 4], m[jt + 5]);
      res[it + jt + 10] = fma52hi(res[it + jt + 10], u[it + 4], m[jt + 5]);
      res[it + jt + 10] = fma52lo(res[it + jt + 10], u[it + 4], m[jt + 6]);
      res[it + jt + 11] = fma52hi(res[it + jt + 11], u[it + 4], m[jt + 6]);
      res[it + jt + 11] = fma52lo(res[it + jt + 11], u[it + 4], m[jt + 7]);
      res[it + jt + 12] = fma52hi(res[it + jt + 12], u[it + 4], m[jt + 7]);
      res[it + jt + 12] = fma52lo(res[it + jt + 12], u[it + 4], m[jt + 8]);
      res[it + jt + 13] = fma52hi(res[it + jt + 13], u[it + 4], m[jt + 8]);
      res[it + jt + 13] = fma52lo(res[it + jt + 13], u[it + 4], m[jt + 9]);
      res[it + jt + 14] = fma52hi(res[it + jt + 14], u[it + 4], m[jt + 9]);
      res[it + 5] = add64(res[it + 5], srli64(res[it + 4], DIGIT_SIZE));
      u[it + 5] = mul52lo(res[it + 5], k);
      res[it + jt + 5] = fma52lo(res[it + jt + 5], u[it + 5], m[jt + 0]);
      res[it + jt + 6] = fma52hi(res[it + jt + 6], u[it + 5], m[jt + 0]);
      res[it + jt + 6] = fma52lo(res[it + jt + 6], u[it + 5], m[jt + 1]);
      res[it + jt + 7] = fma52hi(res[it + jt + 7], u[it + 5], m[jt + 1]);
      res[it + jt + 7] = fma52lo(res[it + jt + 7], u[it + 5], m[jt + 2]);
      res[it + jt + 8] = fma52hi(res[it + jt + 8], u[it + 5], m[jt + 2]);
      res[it + jt + 8] = fma52lo(res[it + jt + 8], u[it + 5], m[jt + 3]);
      res[it + jt + 9] = fma52hi(res[it + jt + 9], u[it + 5], m[jt + 3]);
      res[it + jt + 9] = fma52lo(res[it + jt + 9], u[it + 5], m[jt + 4]);
      res[it + jt + 10] = fma52hi(res[it + jt + 10], u[it + 5], m[jt + 4]);
      res[it + jt + 10] = fma52lo(res[it + jt + 10], u[it + 5], m[jt + 5]);
      res[it + jt + 11] = fma52hi(res[it + jt + 11], u[it + 5], m[jt + 5]);
      res[it + jt + 11] = fma52lo(res[it + jt + 11], u[it + 5], m[jt + 6]);
      res[it + jt + 12] = fma52hi(res[it + jt + 12], u[it + 5], m[jt + 6]);
      res[it + jt + 12] = fma52lo(res[it + jt + 12], u[it + 5], m[jt + 7]);
      res[it + jt + 13] = fma52hi(res[it + jt + 13], u[it + 5], m[jt + 7]);
      res[it + jt + 13] = fma52lo(res[it + jt + 13], u[it + 5], m[jt + 8]);
      res[it + jt + 14] = fma52hi(res[it + jt + 14], u[it + 5], m[jt + 8]);
      res[it + jt + 14] = fma52lo(res[it + jt + 14], u[it + 5], m[jt + 9]);
      res[it + jt + 15] = fma52hi(res[it + jt + 15], u[it + 5], m[jt + 9]);
      res[it + 6] = add64(res[it + 6], srli64(res[it + 5], DIGIT_SIZE));
      u[it + 6] = mul52lo(res[it + 6], k);
      res[it + jt + 6] = fma52lo(res[it + jt + 6], u[it + 6], m[jt + 0]);
      res[it + jt + 7] = fma52hi(res[it + jt + 7], u[it + 6], m[jt + 0]);
      res[it + jt + 7] = fma52lo(res[it + jt + 7], u[it + 6], m[jt + 1]);
      res[it + jt + 8] = fma52hi(res[it + jt + 8], u[it + 6], m[jt + 1]);
      res[it + jt + 8] = fma52lo(res[it + jt + 8], u[it + 6], m[jt + 2]);
      res[it + jt + 9] = fma52hi(res[it + jt + 9], u[it + 6], m[jt + 2]);
      res[it + jt + 9] = fma52lo(res[it + jt + 9], u[it + 6], m[jt + 3]);
      res[it + jt + 10] = fma52hi(res[it + jt + 10], u[it + 6], m[jt + 3]);
      res[it + jt + 10] = fma52lo(res[it + jt + 10], u[it + 6], m[jt + 4]);
      res[it + jt + 11] = fma52hi(res[it + jt + 11], u[it + 6], m[jt + 4]);
      res[it + jt + 11] = fma52lo(res[it + jt + 11], u[it + 6], m[jt + 5]);
      res[it + jt + 12] = fma52hi(res[it + jt + 12], u[it + 6], m[jt + 5]);
      res[it + jt + 12] = fma52lo(res[it + jt + 12], u[it + 6], m[jt + 6]);
      res[it + jt + 13] = fma52hi(res[it + jt + 13], u[it + 6], m[jt + 6]);
      res[it + jt + 13] = fma52lo(res[it + jt + 13], u[it + 6], m[jt + 7]);
      res[it + jt + 14] = fma52hi(res[it + jt + 14], u[it + 6], m[jt + 7]);
      res[it + jt + 14] = fma52lo(res[it + jt + 14], u[it + 6], m[jt + 8]);
      res[it + jt + 15] = fma52hi(res[it + jt + 15], u[it + 6], m[jt + 8]);
      res[it + jt + 15] = fma52lo(res[it + jt + 15], u[it + 6], m[jt + 9]);
      res[it + jt + 16] = fma52hi(res[it + jt + 16], u[it + 6], m[jt + 9]);
      res[it + 7] = add64(res[it + 7], srli64(res[it + 6], DIGIT_SIZE));
      u[it + 7] = mul52lo(res[it + 7], k);
      res[it + jt + 7] = fma52lo(res[it + jt + 7], u[it + 7], m[jt + 0]);
      res[it + jt + 8] = fma52hi(res[it + jt + 8], u[it + 7], m[jt + 0]);
      res[it + jt + 8] = fma52lo(res[it + jt + 8], u[it + 7], m[jt + 1]);
      res[it + jt + 9] = fma52hi(res[it + jt + 9], u[it + 7], m[jt + 1]);
      res[it + jt + 9] = fma52lo(res[it + jt + 9], u[it + 7], m[jt + 2]);
      res[it + jt + 10] = fma52hi(res[it + jt + 10], u[it + 7], m[jt + 2]);
      res[it + jt + 10] = fma52lo(res[it + jt + 10], u[it + 7], m[jt + 3]);
      res[it + jt + 11] = fma52hi(res[it + jt + 11], u[it + 7], m[jt + 3]);
      res[it + jt + 11] = fma52lo(res[it + jt + 11], u[it + 7], m[jt + 4]);
      res[it + jt + 12] = fma52hi(res[it + jt + 12], u[it + 7], m[jt + 4]);
      res[it + jt + 12] = fma52lo(res[it + jt + 12], u[it + 7], m[jt + 5]);
      res[it + jt + 13] = fma52hi(res[it + jt + 13], u[it + 7], m[jt + 5]);
      res[it + jt + 13] = fma52lo(res[it + jt + 13], u[it + 7], m[jt + 6]);
      res[it + jt + 14] = fma52hi(res[it + jt + 14], u[it + 7], m[jt + 6]);
      res[it + jt + 14] = fma52lo(res[it + jt + 14], u[it + 7], m[jt + 7]);
      res[it + jt + 15] = fma52hi(res[it + jt + 15], u[it + 7], m[jt + 7]);
      res[it + jt + 15] = fma52lo(res[it + jt + 15], u[it + 7], m[jt + 8]);
      res[it + jt + 16] = fma52hi(res[it + jt + 16], u[it + 7], m[jt + 8]);
      res[it + jt + 16] = fma52lo(res[it + jt + 16], u[it + 7], m[jt + 9]);
      res[it + jt + 17] = fma52hi(res[it + jt + 17], u[it + 7], m[jt + 9]);
      res[it + 8] = add64(res[it + 8], srli64(res[it + 7], DIGIT_SIZE));
      u[it + 8] = mul52lo(res[it + 8], k);
      res[it + jt + 8] = fma52lo(res[it + jt + 8], u[it + 8], m[jt + 0]);
      res[it + jt + 9] = fma52hi(res[it + jt + 9], u[it + 8], m[jt + 0]);
      res[it + jt + 9] = fma52lo(res[it + jt + 9], u[it + 8], m[jt + 1]);
      res[it + jt + 10] = fma52hi(res[it + jt + 10], u[it + 8], m[jt + 1]);
      res[it + jt + 10] = fma52lo(res[it + jt + 10], u[it + 8], m[jt + 2]);
      res[it + jt + 11] = fma52hi(res[it + jt + 11], u[it + 8], m[jt + 2]);
      res[it + jt + 11] = fma52lo(res[it + jt + 11], u[it + 8], m[jt + 3]);
      res[it + jt + 12] = fma52hi(res[it + jt + 12], u[it + 8], m[jt + 3]);
      res[it + jt + 12] = fma52lo(res[it + jt + 12], u[it + 8], m[jt + 4]);
      res[it + jt + 13] = fma52hi(res[it + jt + 13], u[it + 8], m[jt + 4]);
      res[it + jt + 13] = fma52lo(res[it + jt + 13], u[it + 8], m[jt + 5]);
      res[it + jt + 14] = fma52hi(res[it + jt + 14], u[it + 8], m[jt + 5]);
      res[it + jt + 14] = fma52lo(res[it + jt + 14], u[it + 8], m[jt + 6]);
      res[it + jt + 15] = fma52hi(res[it + jt + 15], u[it + 8], m[jt + 6]);
      res[it + jt + 15] = fma52lo(res[it + jt + 15], u[it + 8], m[jt + 7]);
      res[it + jt + 16] = fma52hi(res[it + jt + 16], u[it + 8], m[jt + 7]);
      res[it + jt + 16] = fma52lo(res[it + jt + 16], u[it + 8], m[jt + 8]);
      res[it + jt + 17] = fma52hi(res[it + jt + 17], u[it + 8], m[jt + 8]);
      res[it + jt + 17] = fma52lo(res[it + jt + 17], u[it + 8], m[jt + 9]);
      res[it + jt + 18] = fma52hi(res[it + jt + 18], u[it + 8], m[jt + 9]);
      res[it + 9] = add64(res[it + 9], srli64(res[it + 8], DIGIT_SIZE));
      u[it + 9] = mul52lo(res[it + 9], k);
      res[it + jt + 9] = fma52lo(res[it + jt + 9], u[it + 9], m[jt + 0]);
      res[it + jt + 10] = fma52hi(res[it + jt + 10], u[it + 9], m[jt + 0]);
      res[it + jt + 10] = fma52lo(res[it + jt + 10], u[it + 9], m[jt + 1]);
      res[it + jt + 11] = fma52hi(res[it + jt + 11], u[it + 9], m[jt + 1]);
      res[it + jt + 11] = fma52lo(res[it + jt + 11], u[it + 9], m[jt + 2]);
      res[it + jt + 12] = fma52hi(res[it + jt + 12], u[it + 9], m[jt + 2]);
      res[it + jt + 12] = fma52lo(res[it + jt + 12], u[it + 9], m[jt + 3]);
      res[it + jt + 13] = fma52hi(res[it + jt + 13], u[it + 9], m[jt + 3]);
      res[it + jt + 13] = fma52lo(res[it + jt + 13], u[it + 9], m[jt + 4]);
      res[it + jt + 14] = fma52hi(res[it + jt + 14], u[it + 9], m[jt + 4]);
      res[it + jt + 14] = fma52lo(res[it + jt + 14], u[it + 9], m[jt + 5]);
      res[it + jt + 15] = fma52hi(res[it + jt + 15], u[it + 9], m[jt + 5]);
      res[it + jt + 15] = fma52lo(res[it + jt + 15], u[it + 9], m[jt + 6]);
      res[it + jt + 16] = fma52hi(res[it + jt + 16], u[it + 9], m[jt + 6]);
      res[it + jt + 16] = fma52lo(res[it + jt + 16], u[it + 9], m[jt + 7]);
      res[it + jt + 17] = fma52hi(res[it + jt + 17], u[it + 9], m[jt + 7]);
      res[it + jt + 17] = fma52lo(res[it + jt + 17], u[it + 9], m[jt + 8]);
      res[it + jt + 18] = fma52hi(res[it + jt + 18], u[it + 9], m[jt + 8]);
      res[it + jt + 18] = fma52lo(res[it + jt + 18], u[it + 9], m[jt + 9]);
      res[it + jt + 19] = fma52hi(res[it + jt + 19], u[it + 9], m[jt + 9]);

      for (jt = 10; jt < 40; jt += 10) { // Poly tile
        res[it + jt + 0] = fma52lo(res[it + jt + 0], u[it + 0], m[jt + 0]);
        res[it + jt + 1] = fma52hi(res[it + jt + 1], u[it + 0], m[jt + 0]);
        res[it + jt + 1] = fma52lo(res[it + jt + 1], u[it + 0], m[jt + 1]);
        res[it + jt + 2] = fma52hi(res[it + jt + 2], u[it + 0], m[jt + 1]);
        res[it + jt + 2] = fma52lo(res[it + jt + 2], u[it + 0], m[jt + 2]);
        res[it + jt + 3] = fma52hi(res[it + jt + 3], u[it + 0], m[jt + 2]);
        res[it + jt + 3] = fma52lo(res[it + jt + 3], u[it + 0], m[jt + 3]);
        res[it + jt + 4] = fma52hi(res[it + jt + 4], u[it + 0], m[jt + 3]);
        res[it + jt + 4] = fma52lo(res[it + jt + 4], u[it + 0], m[jt + 4]);
        res[it + jt + 5] = fma52hi(res[it + jt + 5], u[it + 0], m[jt + 4]);
        res[it + jt + 5] = fma52lo(res[it + jt + 5], u[it + 0], m[jt + 5]);
        res[it + jt + 6] = fma52hi(res[it + jt + 6], u[it + 0], m[jt + 5]);
        res[it + jt + 6] = fma52lo(res[it + jt + 6], u[it + 0], m[jt + 6]);
        res[it + jt + 7] = fma52hi(res[it + jt + 7], u[it + 0], m[jt + 6]);
        res[it + jt + 7] = fma52lo(res[it + jt + 7], u[it + 0], m[jt + 7]);
        res[it + jt + 8] = fma52hi(res[it + jt + 8], u[it + 0], m[jt + 7]);
        res[it + jt + 8] = fma52lo(res[it + jt + 8], u[it + 0], m[jt + 8]);
        res[it + jt + 9] = fma52hi(res[it + jt + 9], u[it + 0], m[jt + 8]);
        res[it + jt + 9] = fma52lo(res[it + jt + 9], u[it + 0], m[jt + 9]);
        res[it + jt + 10] = fma52hi(res[it + jt + 10], u[it + 0], m[jt + 9]);
        res[it + jt + 1] = fma52lo(res[it + jt + 1], u[it + 1], m[jt + 0]);
        res[it + jt + 2] = fma52hi(res[it + jt + 2], u[it + 1], m[jt + 0]);
        res[it + jt + 2] = fma52lo(res[it + jt + 2], u[it + 1], m[jt + 1]);
        res[it + jt + 3] = fma52hi(res[it + jt + 3], u[it + 1], m[jt + 1]);
        res[it + jt + 3] = fma52lo(res[it + jt + 3], u[it + 1], m[jt + 2]);
        res[it + jt + 4] = fma52hi(res[it + jt + 4], u[it + 1], m[jt + 2]);
        res[it + jt + 4] = fma52lo(res[it + jt + 4], u[it + 1], m[jt + 3]);
        res[it + jt + 5] = fma52hi(res[it + jt + 5], u[it + 1], m[jt + 3]);
        res[it + jt + 5] = fma52lo(res[it + jt + 5], u[it + 1], m[jt + 4]);
        res[it + jt + 6] = fma52hi(res[it + jt + 6], u[it + 1], m[jt + 4]);
        res[it + jt + 6] = fma52lo(res[it + jt + 6], u[it + 1], m[jt + 5]);
        res[it + jt + 7] = fma52hi(res[it + jt + 7], u[it + 1], m[jt + 5]);
        res[it + jt + 7] = fma52lo(res[it + jt + 7], u[it + 1], m[jt + 6]);
        res[it + jt + 8] = fma52hi(res[it + jt + 8], u[it + 1], m[jt + 6]);
        res[it + jt + 8] = fma52lo(res[it + jt + 8], u[it + 1], m[jt + 7]);
        res[it + jt + 9] = fma52hi(res[it + jt + 9], u[it + 1], m[jt + 7]);
        res[it + jt + 9] = fma52lo(res[it + jt + 9], u[it + 1], m[jt + 8]);
        res[it + jt + 10] = fma52hi(res[it + jt + 10], u[it + 1], m[jt + 8]);
        res[it + jt + 10] = fma52lo(res[it + jt + 10], u[it + 1], m[jt + 9]);
        res[it + jt + 11] = fma52hi(res[it + jt + 11], u[it + 1], m[jt + 9]);
        res[it + jt + 2] = fma52lo(res[it + jt + 2], u[it + 2], m[jt + 0]);
        res[it + jt + 3] = fma52hi(res[it + jt + 3], u[it + 2], m[jt + 0]);
        res[it + jt + 3] = fma52lo(res[it + jt + 3], u[it + 2], m[jt + 1]);
        res[it + jt + 4] = fma52hi(res[it + jt + 4], u[it + 2], m[jt + 1]);
        res[it + jt + 4] = fma52lo(res[it + jt + 4], u[it + 2], m[jt + 2]);
        res[it + jt + 5] = fma52hi(res[it + jt + 5], u[it + 2], m[jt + 2]);
        res[it + jt + 5] = fma52lo(res[it + jt + 5], u[it + 2], m[jt + 3]);
        res[it + jt + 6] = fma52hi(res[it + jt + 6], u[it + 2], m[jt + 3]);
        res[it + jt + 6] = fma52lo(res[it + jt + 6], u[it + 2], m[jt + 4]);
        res[it + jt + 7] = fma52hi(res[it + jt + 7], u[it + 2], m[jt + 4]);
        res[it + jt + 7] = fma52lo(res[it + jt + 7], u[it + 2], m[jt + 5]);
        res[it + jt + 8] = fma52hi(res[it + jt + 8], u[it + 2], m[jt + 5]);
        res[it + jt + 8] = fma52lo(res[it + jt + 8], u[it + 2], m[jt + 6]);
        res[it + jt + 9] = fma52hi(res[it + jt + 9], u[it + 2], m[jt + 6]);
        res[it + jt + 9] = fma52lo(res[it + jt + 9], u[it + 2], m[jt + 7]);
        res[it + jt + 10] = fma52hi(res[it + jt + 10], u[it + 2], m[jt + 7]);
        res[it + jt + 10] = fma52lo(res[it + jt + 10], u[it + 2], m[jt + 8]);
        res[it + jt + 11] = fma52hi(res[it + jt + 11], u[it + 2], m[jt + 8]);
        res[it + jt + 11] = fma52lo(res[it + jt + 11], u[it + 2], m[jt + 9]);
        res[it + jt + 12] = fma52hi(res[it + jt + 12], u[it + 2], m[jt + 9]);
        res[it + jt + 3] = fma52lo(res[it + jt + 3], u[it + 3], m[jt + 0]);
        res[it + jt + 4] = fma52hi(res[it + jt + 4], u[it + 3], m[jt + 0]);
        res[it + jt + 4] = fma52lo(res[it + jt + 4], u[it + 3], m[jt + 1]);
        res[it + jt + 5] = fma52hi(res[it + jt + 5], u[it + 3], m[jt + 1]);
        res[it + jt + 5] = fma52lo(res[it + jt + 5], u[it + 3], m[jt + 2]);
        res[it + jt + 6] = fma52hi(res[it + jt + 6], u[it + 3], m[jt + 2]);
        res[it + jt + 6] = fma52lo(res[it + jt + 6], u[it + 3], m[jt + 3]);
        res[it + jt + 7] = fma52hi(res[it + jt + 7], u[it + 3], m[jt + 3]);
        res[it + jt + 7] = fma52lo(res[it + jt + 7], u[it + 3], m[jt + 4]);
        res[it + jt + 8] = fma52hi(res[it + jt + 8], u[it + 3], m[jt + 4]);
        res[it + jt + 8] = fma52lo(res[it + jt + 8], u[it + 3], m[jt + 5]);
        res[it + jt + 9] = fma52hi(res[it + jt + 9], u[it + 3], m[jt + 5]);
        res[it + jt + 9] = fma52lo(res[it + jt + 9], u[it + 3], m[jt + 6]);
        res[it + jt + 10] = fma52hi(res[it + jt + 10], u[it + 3], m[jt + 6]);
        res[it + jt + 10] = fma52lo(res[it + jt + 10], u[it + 3], m[jt + 7]);
        res[it + jt + 11] = fma52hi(res[it + jt + 11], u[it + 3], m[jt + 7]);
        res[it + jt + 11] = fma52lo(res[it + jt + 11], u[it + 3], m[jt + 8]);
        res[it + jt + 12] = fma52hi(res[it + jt + 12], u[it + 3], m[jt + 8]);
        res[it + jt + 12] = fma52lo(res[it + jt + 12], u[it + 3], m[jt + 9]);
        res[it + jt + 13] = fma52hi(res[it + jt + 13], u[it + 3], m[jt + 9]);
        res[it + jt + 4] = fma52lo(res[it + jt + 4], u[it + 4], m[jt + 0]);
        res[it + jt + 5] = fma52hi(res[it + jt + 5], u[it + 4], m[jt + 0]);
        res[it + jt + 5] = fma52lo(res[it + jt + 5], u[it + 4], m[jt + 1]);
        res[it + jt + 6] = fma52hi(res[it + jt + 6], u[it + 4], m[jt + 1]);
        res[it + jt + 6] = fma52lo(res[it + jt + 6], u[it + 4], m[jt + 2]);
        res[it + jt + 7] = fma52hi(res[it + jt + 7], u[it + 4], m[jt + 2]);
        res[it + jt + 7] = fma52lo(res[it + jt + 7], u[it + 4], m[jt + 3]);
        res[it + jt + 8] = fma52hi(res[it + jt + 8], u[it + 4], m[jt + 3]);
        res[it + jt + 8] = fma52lo(res[it + jt + 8], u[it + 4], m[jt + 4]);
        res[it + jt + 9] = fma52hi(res[it + jt + 9], u[it + 4], m[jt + 4]);
        res[it + jt + 9] = fma52lo(res[it + jt + 9], u[it + 4], m[jt + 5]);
        res[it + jt + 10] = fma52hi(res[it + jt + 10], u[it + 4], m[jt + 5]);
        res[it + jt + 10] = fma52lo(res[it + jt + 10], u[it + 4], m[jt + 6]);
        res[it + jt + 11] = fma52hi(res[it + jt + 11], u[it + 4], m[jt + 6]);
        res[it + jt + 11] = fma52lo(res[it + jt + 11], u[it + 4], m[jt + 7]);
        res[it + jt + 12] = fma52hi(res[it + jt + 12], u[it + 4], m[jt + 7]);
        res[it + jt + 12] = fma52lo(res[it + jt + 12], u[it + 4], m[jt + 8]);
        res[it + jt + 13] = fma52hi(res[it + jt + 13], u[it + 4], m[jt + 8]);
        res[it + jt + 13] = fma52lo(res[it + jt + 13], u[it + 4], m[jt + 9]);
        res[it + jt + 14] = fma52hi(res[it + jt + 14], u[it + 4], m[jt + 9]);
        res[it + jt + 5] = fma52lo(res[it + jt + 5], u[it + 5], m[jt + 0]);
        res[it + jt + 6] = fma52hi(res[it + jt + 6], u[it + 5], m[jt + 0]);
        res[it + jt + 6] = fma52lo(res[it + jt + 6], u[it + 5], m[jt + 1]);
        res[it + jt + 7] = fma52hi(res[it + jt + 7], u[it + 5], m[jt + 1]);
        res[it + jt + 7] = fma52lo(res[it + jt + 7], u[it + 5], m[jt + 2]);
        res[it + jt + 8] = fma52hi(res[it + jt + 8], u[it + 5], m[jt + 2]);
        res[it + jt + 8] = fma52lo(res[it + jt + 8], u[it + 5], m[jt + 3]);
        res[it + jt + 9] = fma52hi(res[it + jt + 9], u[it + 5], m[jt + 3]);
        res[it + jt + 9] = fma52lo(res[it + jt + 9], u[it + 5], m[jt + 4]);
        res[it + jt + 10] = fma52hi(res[it + jt + 10], u[it + 5], m[jt + 4]);
        res[it + jt + 10] = fma52lo(res[it + jt + 10], u[it + 5], m[jt + 5]);
        res[it + jt + 11] = fma52hi(res[it + jt + 11], u[it + 5], m[jt + 5]);
        res[it + jt + 11] = fma52lo(res[it + jt + 11], u[it + 5], m[jt + 6]);
        res[it + jt + 12] = fma52hi(res[it + jt + 12], u[it + 5], m[jt + 6]);
        res[it + jt + 12] = fma52lo(res[it + jt + 12], u[it + 5], m[jt + 7]);
        res[it + jt + 13] = fma52hi(res[it + jt + 13], u[it + 5], m[jt + 7]);
        res[it + jt + 13] = fma52lo(res[it + jt + 13], u[it + 5], m[jt + 8]);
        res[it + jt + 14] = fma52hi(res[it + jt + 14], u[it + 5], m[jt + 8]);
        res[it + jt + 14] = fma52lo(res[it + jt + 14], u[it + 5], m[jt + 9]);
        res[it + jt + 15] = fma52hi(res[it + jt + 15], u[it + 5], m[jt + 9]);
        res[it + jt + 6] = fma52lo(res[it + jt + 6], u[it + 6], m[jt + 0]);
        res[it + jt + 7] = fma52hi(res[it + jt + 7], u[it + 6], m[jt + 0]);
        res[it + jt + 7] = fma52lo(res[it + jt + 7], u[it + 6], m[jt + 1]);
        res[it + jt + 8] = fma52hi(res[it + jt + 8], u[it + 6], m[jt + 1]);
        res[it + jt + 8] = fma52lo(res[it + jt + 8], u[it + 6], m[jt + 2]);
        res[it + jt + 9] = fma52hi(res[it + jt + 9], u[it + 6], m[jt + 2]);
        res[it + jt + 9] = fma52lo(res[it + jt + 9], u[it + 6], m[jt + 3]);
        res[it + jt + 10] = fma52hi(res[it + jt + 10], u[it + 6], m[jt + 3]);
        res[it + jt + 10] = fma52lo(res[it + jt + 10], u[it + 6], m[jt + 4]);
        res[it + jt + 11] = fma52hi(res[it + jt + 11], u[it + 6], m[jt + 4]);
        res[it + jt + 11] = fma52lo(res[it + jt + 11], u[it + 6], m[jt + 5]);
        res[it + jt + 12] = fma52hi(res[it + jt + 12], u[it + 6], m[jt + 5]);
        res[it + jt + 12] = fma52lo(res[it + jt + 12], u[it + 6], m[jt + 6]);
        res[it + jt + 13] = fma52hi(res[it + jt + 13], u[it + 6], m[jt + 6]);
        res[it + jt + 13] = fma52lo(res[it + jt + 13], u[it + 6], m[jt + 7]);
        res[it + jt + 14] = fma52hi(res[it + jt + 14], u[it + 6], m[jt + 7]);
        res[it + jt + 14] = fma52lo(res[it + jt + 14], u[it + 6], m[jt + 8]);
        res[it + jt + 15] = fma52hi(res[it + jt + 15], u[it + 6], m[jt + 8]);
        res[it + jt + 15] = fma52lo(res[it + jt + 15], u[it + 6], m[jt + 9]);
        res[it + jt + 16] = fma52hi(res[it + jt + 16], u[it + 6], m[jt + 9]);
        res[it + jt + 7] = fma52lo(res[it + jt + 7], u[it + 7], m[jt + 0]);
        res[it + jt + 8] = fma52hi(res[it + jt + 8], u[it + 7], m[jt + 0]);
        res[it + jt + 8] = fma52lo(res[it + jt + 8], u[it + 7], m[jt + 1]);
        res[it + jt + 9] = fma52hi(res[it + jt + 9], u[it + 7], m[jt + 1]);
        res[it + jt + 9] = fma52lo(res[it + jt + 9], u[it + 7], m[jt + 2]);
        res[it + jt + 10] = fma52hi(res[it + jt + 10], u[it + 7], m[jt + 2]);
        res[it + jt + 10] = fma52lo(res[it + jt + 10], u[it + 7], m[jt + 3]);
        res[it + jt + 11] = fma52hi(res[it + jt + 11], u[it + 7], m[jt + 3]);
        res[it + jt + 11] = fma52lo(res[it + jt + 11], u[it + 7], m[jt + 4]);
        res[it + jt + 12] = fma52hi(res[it + jt + 12], u[it + 7], m[jt + 4]);
        res[it + jt + 12] = fma52lo(res[it + jt + 12], u[it + 7], m[jt + 5]);
        res[it + jt + 13] = fma52hi(res[it + jt + 13], u[it + 7], m[jt + 5]);
        res[it + jt + 13] = fma52lo(res[it + jt + 13], u[it + 7], m[jt + 6]);
        res[it + jt + 14] = fma52hi(res[it + jt + 14], u[it + 7], m[jt + 6]);
        res[it + jt + 14] = fma52lo(res[it + jt + 14], u[it + 7], m[jt + 7]);
        res[it + jt + 15] = fma52hi(res[it + jt + 15], u[it + 7], m[jt + 7]);
        res[it + jt + 15] = fma52lo(res[it + jt + 15], u[it + 7], m[jt + 8]);
        res[it + jt + 16] = fma52hi(res[it + jt + 16], u[it + 7], m[jt + 8]);
        res[it + jt + 16] = fma52lo(res[it + jt + 16], u[it + 7], m[jt + 9]);
        res[it + jt + 17] = fma52hi(res[it + jt + 17], u[it + 7], m[jt + 9]);
        res[it + jt + 8] = fma52lo(res[it + jt + 8], u[it + 8], m[jt + 0]);
        res[it + jt + 9] = fma52hi(res[it + jt + 9], u[it + 8], m[jt + 0]);
        res[it + jt + 9] = fma52lo(res[it + jt + 9], u[it + 8], m[jt + 1]);
        res[it + jt + 10] = fma52hi(res[it + jt + 10], u[it + 8], m[jt + 1]);
        res[it + jt + 10] = fma52lo(res[it + jt + 10], u[it + 8], m[jt + 2]);
        res[it + jt + 11] = fma52hi(res[it + jt + 11], u[it + 8], m[jt + 2]);
        res[it + jt + 11] = fma52lo(res[it + jt + 11], u[it + 8], m[jt + 3]);
        res[it + jt + 12] = fma52hi(res[it + jt + 12], u[it + 8], m[jt + 3]);
        res[it + jt + 12] = fma52lo(res[it + jt + 12], u[it + 8], m[jt + 4]);
        res[it + jt + 13] = fma52hi(res[it + jt + 13], u[it + 8], m[jt + 4]);
        res[it + jt + 13] = fma52lo(res[it + jt + 13], u[it + 8], m[jt + 5]);
        res[it + jt + 14] = fma52hi(res[it + jt + 14], u[it + 8], m[jt + 5]);
        res[it + jt + 14] = fma52lo(res[it + jt + 14], u[it + 8], m[jt + 6]);
        res[it + jt + 15] = fma52hi(res[it + jt + 15], u[it + 8], m[jt + 6]);
        res[it + jt + 15] = fma52lo(res[it + jt + 15], u[it + 8], m[jt + 7]);
        res[it + jt + 16] = fma52hi(res[it + jt + 16], u[it + 8], m[jt + 7]);
        res[it + jt + 16] = fma52lo(res[it + jt + 16], u[it + 8], m[jt + 8]);
        res[it + jt + 17] = fma52hi(res[it + jt + 17], u[it + 8], m[jt + 8]);
        res[it + jt + 17] = fma52lo(res[it + jt + 17], u[it + 8], m[jt + 9]);
        res[it + jt + 18] = fma52hi(res[it + jt + 18], u[it + 8], m[jt + 9]);
        res[it + jt + 9] = fma52lo(res[it + jt + 9], u[it + 9], m[jt + 0]);
        res[it + jt + 10] = fma52hi(res[it + jt + 10], u[it + 9], m[jt + 0]);
        res[it + jt + 10] = fma52lo(res[it + jt + 10], u[it + 9], m[jt + 1]);
        res[it + jt + 11] = fma52hi(res[it + jt + 11], u[it + 9], m[jt + 1]);
        res[it + jt + 11] = fma52lo(res[it + jt + 11], u[it + 9], m[jt + 2]);
        res[it + jt + 12] = fma52hi(res[it + jt + 12], u[it + 9], m[jt + 2]);
        res[it + jt + 12] = fma52lo(res[it + jt + 12], u[it + 9], m[jt + 3]);
        res[it + jt + 13] = fma52hi(res[it + jt + 13], u[it + 9], m[jt + 3]);
        res[it + jt + 13] = fma52lo(res[it + jt + 13], u[it + 9], m[jt + 4]);
        res[it + jt + 14] = fma52hi(res[it + jt + 14], u[it + 9], m[jt + 4]);
        res[it + jt + 14] = fma52lo(res[it + jt + 14], u[it + 9], m[jt + 5]);
        res[it + jt + 15] = fma52hi(res[it + jt + 15], u[it + 9], m[jt + 5]);
        res[it + jt + 15] = fma52lo(res[it + jt + 15], u[it + 9], m[jt + 6]);
        res[it + jt + 16] = fma52hi(res[it + jt + 16], u[it + 9], m[jt + 6]);
        res[it + jt + 16] = fma52lo(res[it + jt + 16], u[it + 9], m[jt + 7]);
        res[it + jt + 17] = fma52hi(res[it + jt + 17], u[it + 9], m[jt + 7]);
        res[it + jt + 17] = fma52lo(res[it + jt + 17], u[it + 9], m[jt + 8]);
        res[it + jt + 18] = fma52hi(res[it + jt + 18], u[it + 9], m[jt + 8]);
        res[it + jt + 18] = fma52lo(res[it + jt + 18], u[it + 9], m[jt + 9]);
        res[it + jt + 19] = fma52hi(res[it + jt + 19], u[it + 9], m[jt + 9]);
      }
    }

    // Normalization
    res[40] = add64(res[40], srli64(res[39], DIGIT_SIZE));
    r[0] = res[40];
    res[41] = add64(res[41], srli64(res[40], DIGIT_SIZE));
    r[1] = res[41];
    res[42] = add64(res[42], srli64(res[41], DIGIT_SIZE));
    r[2] = res[42];
    res[43] = add64(res[43], srli64(res[42], DIGIT_SIZE));
    r[3] = res[43];
    res[44] = add64(res[44], srli64(res[43], DIGIT_SIZE));
    r[4] = res[44];
    res[45] = add64(res[45], srli64(res[44], DIGIT_SIZE));
    r[5] = res[45];
    res[46] = add64(res[46], srli64(res[45], DIGIT_SIZE));
    r[6] = res[46];
    res[47] = add64(res[47], srli64(res[46], DIGIT_SIZE));
    r[7] = res[47];
    res[48] = add64(res[48], srli64(res[47], DIGIT_SIZE));
    r[8] = res[48];
    res[49] = add64(res[49], srli64(res[48], DIGIT_SIZE));
    r[9] = res[49];
    res[50] = add64(res[50], srli64(res[49], DIGIT_SIZE));
    r[10] = res[50];
    res[51] = add64(res[51], srli64(res[50], DIGIT_SIZE));
    r[11] = res[51];
    res[52] = add64(res[52], srli64(res[51], DIGIT_SIZE));
    r[12] = res[52];
    res[53] = add64(res[53], srli64(res[52], DIGIT_SIZE));
    r[13] = res[53];
    res[54] = add64(res[54], srli64(res[53], DIGIT_SIZE));
    r[14] = res[54];
    res[55] = add64(res[55], srli64(res[54], DIGIT_SIZE));
    r[15] = res[55];
    res[56] = add64(res[56], srli64(res[55], DIGIT_SIZE));
    r[16] = res[56];
    res[57] = add64(res[57], srli64(res[56], DIGIT_SIZE));
    r[17] = res[57];
    res[58] = add64(res[58], srli64(res[57], DIGIT_SIZE));
    r[18] = res[58];
    res[59] = add64(res[59], srli64(res[58], DIGIT_SIZE));
    r[19] = res[59];
    res[60] = add64(res[60], srli64(res[59], DIGIT_SIZE));
    r[20] = res[60];
    res[61] = add64(res[61], srli64(res[60], DIGIT_SIZE));
    r[21] = res[61];
    res[62] = add64(res[62], srli64(res[61], DIGIT_SIZE));
    r[22] = res[62];
    res[63] = add64(res[63], srli64(res[62], DIGIT_SIZE));
    r[23] = res[63];
    res[64] = add64(res[64], srli64(res[63], DIGIT_SIZE));
    r[24] = res[64];
    res[65] = add64(res[65], srli64(res[64], DIGIT_SIZE));
    r[25] = res[65];
    res[66] = add64(res[66], srli64(res[65], DIGIT_SIZE));
    r[26] = res[66];
    res[67] = add64(res[67], srli64(res[66], DIGIT_SIZE));
    r[27] = res[67];
    res[68] = add64(res[68], srli64(res[67], DIGIT_SIZE));
    r[28] = res[68];
    res[69] = add64(res[69], srli64(res[68], DIGIT_SIZE));
    r[29] = res[69];
    res[70] = add64(res[70], srli64(res[69], DIGIT_SIZE));
    r[30] = res[70];
    res[71] = add64(res[71], srli64(res[70], DIGIT_SIZE));
    r[31] = res[71];
    res[72] = add64(res[72], srli64(res[71], DIGIT_SIZE));
    r[32] = res[72];
    res[73] = add64(res[73], srli64(res[72], DIGIT_SIZE));
    r[33] = res[73];
    res[74] = add64(res[74], srli64(res[73], DIGIT_SIZE));
    r[34] = res[74];
    res[75] = add64(res[75], srli64(res[74], DIGIT_SIZE));
    r[35] = res[75];
    res[76] = add64(res[76], srli64(res[75], DIGIT_SIZE));
    r[36] = res[76];
    res[77] = add64(res[77], srli64(res[76], DIGIT_SIZE));
    r[37] = res[77];
    res[78] = add64(res[78], srli64(res[77], DIGIT_SIZE));
    r[38] = res[78];
    res[79] = add64(res[79], srli64(res[78], DIGIT_SIZE));
    r[39] = res[79];
    a = (U64 *)out_mb;
  }
}
